You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "indvdum (JIRA)" <ji...@apache.org> on 2013/01/05 23:22:12 UTC
[jira] [Created] (OPENJPA-2319) Second (and following) execution of
same JQPL is failed
indvdum created OPENJPA-2319:
--------------------------------
Summary: Second (and following) execution of same JQPL is failed
Key: OPENJPA-2319
URL: https://issues.apache.org/jira/browse/OPENJPA-2319
Project: OpenJPA
Issue Type: Bug
Components: sql
Affects Versions: 2.2.1
Environment: Debian testing
OpenJDK Runtime Environment (IcedTea7 2.1.3) (7u3-2.1.3-1)
Maven 3.0.4
Groovy 2.0.5
PostgreSQL 9.1-901-1.jdbc4
Tomcat or Jetty web server
Reporter: indvdum
Getting ReportingSQLException after second (and following) execution of JQPL. First execution (after server start) is normal.
{code:title=code|borderStyle=solid}
...
public List<Payment> getPayments(IPayable participan) {
Query query = em.createQuery("select p from Payment p where (p.sender = ?1 or p.recipient = ?1) order by p.createDate desc");
query.setParameter(1, );
return (List<Payment>) query.getResultList();
}
...
{code}
{code:title=log after first call of getPayments()|borderStyle=solid}
33779 download-x TRACE [http-bio-8080-exec-10] openjpa.jdbc.SQL - <t 2028134790, conn 1685658195> executing prepstmnt 1156839632
SELECT t0.id, t0.dtype, t0.createdate, t0.description,
t0.recipient, t0.recipientaftercash,
t0.recipientbeforecash, t0.sender,
t0.senderaftercash, t0.senderbeforecash, t0.type,
t0.value, t0.download_id
FROM public.Payment t0
WHERE (t0.sender = ? OR t0.recipient = ?)
ORDER BY t0.createdate DESC
[params=(String) ru.bazon.downloadx.entities.security.User:51, (String) ru.bazon.downloadx.entities.security.User:51]
33782 download-x TRACE [http-bio-8080-exec-10] openjpa.jdbc.SQL - <t 2028134790, conn 1685658195> [3 ms] spent
{code}
{code:title=log after second (and following) call of getPayments()|borderStyle=solid}
165632 download-x TRACE [http-bio-8080-exec-10] openjpa.jdbc.SQL - <t 2028134790, conn 1685658195> executing prepstmnt 344249860
SELECT t0.id, t0.dtype, t0.createdate, t0.description,
t0.recipient, t0.recipientaftercash,
t0.recipientbeforecash, t0.sender,
t0.senderaftercash, t0.senderbeforecash, t0.type,
t0.value, t0.download_id
FROM public.Payment t0
WHERE (t0.sender = ? OR t0.recipient = ?)
ORDER BY t0.createdate DESC
[params=(int) 51, (int) 51]
165635 download-x TRACE [http-bio-8080-exec-10] openjpa.jdbc.SQL - <t 2028134790, conn 1685658195> [3 ms] spent
<openjpa-2.2.1-r422266:1396819 fatal general error> org.apache.openjpa.persistence.PersistenceException: ERROR: operator does not exist: character varying = integer
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 243 {prepstmnt 344249860
SELECT t0.id, t0.dtype, t0.createdate, t0.description,
t0.recipient, t0.recipientaftercash,
t0.recipientbeforecash, t0.sender,
t0.senderaftercash, t0.senderbeforecash, t0.type,
t0.value, t0.download_id
FROM public.Payment t0
WHERE (t0.sender = ? OR t0.recipient = ?)
ORDER BY t0.createdate DESC
[params=(int) 51, (int) 51]} [code=0, state=42883]
at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4958)
at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4918)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:110)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:62)
at org.apache.openjpa.jdbc.kernel.PreparedSQLStoreQuery$PreparedSQLExecutor.executeQuery(PreparedSQLStoreQuery.java:139)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
at javax.persistence.TypedQuery$getResultList.call(Unknown Source)
at ru.indvdum.jpa.dao.JPADataAccessObject.list(JPADataAccessObject.groovy:208)
at ru.bazon.downloadx.dao.DAO.getPayments(DAO.java:422)
at ru.bazon.downloadx.web.vaadin.main.mypayments.MyAllPaymentsComponent.redraw(MyAllPaymentsComponent.java:105)
at ru.bazon.downloadx.web.vaadin.main.MyPaymentsComponent.redraw(MyPaymentsComponent.java:47)
at ru.bazon.downloadx.web.vaadin.DownloadXComponent$3.selectedTabChange(DownloadXComponent.java:148)
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:510)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:164)
at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1219)
at com.vaadin.ui.TabSheet.fireSelectedTabChange(TabSheet.java:876)
at com.vaadin.ui.TabSheet.setSelectedTab(TabSheet.java:606)
at com.vaadin.ui.TabSheet.changeVariables(TabSheet.java:695)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.changeVariables(AbstractCommunicationManager.java:1460)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1404)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1329)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:761)
at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:323)
at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR: operator does not exist: character varying = integer
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 243 {prepstmnt 344249860
SELECT t0.id, t0.dtype, t0.createdate, t0.description,
t0.recipient, t0.recipientaftercash,
t0.recipientbeforecash, t0.sender,
t0.senderaftercash, t0.senderbeforecash, t0.type,
t0.value, t0.download_id
FROM public.Payment t0
WHERE (t0.sender = ? OR t0.recipient = ?)
ORDER BY t0.createdate DESC
[params=(int) 51, (int) 51]} [code=0, state=42883]
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:59)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:1118)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:265)
at org.apache.openjpa.jdbc.sql.PostgresDictionary$PostgresPreparedStatement.executeQuery(PostgresDictionary.java:1019)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:265)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1774)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:255)
at org.apache.openjpa.jdbc.kernel.PreparedSQLStoreQuery$PreparedSQLExecutor.executeQuery(PreparedSQLStoreQuery.java:118)
... 59 more
NestedThrowables:
org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = integer
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 243
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:267)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:1116)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:265)
at org.apache.openjpa.jdbc.sql.PostgresDictionary$PostgresPreparedStatement.executeQuery(PostgresDictionary.java:1019)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:265)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1774)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:255)
at org.apache.openjpa.jdbc.kernel.PreparedSQLStoreQuery$PreparedSQLExecutor.executeQuery(PreparedSQLStoreQuery.java:118)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:286)
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)
at javax.persistence.TypedQuery$getResultList.call(Unknown Source)
at ru.indvdum.jpa.dao.JPADataAccessObject.list(JPADataAccessObject.groovy:208)
at ru.bazon.downloadx.dao.DAO.getPayments(DAO.java:422)
at ru.bazon.downloadx.web.vaadin.main.mypayments.MyAllPaymentsComponent.redraw(MyAllPaymentsComponent.java:105)
at ru.bazon.downloadx.web.vaadin.main.MyPaymentsComponent.redraw(MyPaymentsComponent.java:47)
at ru.bazon.downloadx.web.vaadin.DownloadXComponent$3.selectedTabChange(DownloadXComponent.java:148)
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:510)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:164)
at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1219)
at com.vaadin.ui.TabSheet.fireSelectedTabChange(TabSheet.java:876)
at com.vaadin.ui.TabSheet.setSelectedTab(TabSheet.java:606)
at com.vaadin.ui.TabSheet.changeVariables(TabSheet.java:695)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.changeVariables(AbstractCommunicationManager.java:1460)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1404)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1329)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:761)
at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:323)
at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
{code}
{code:title=persistence.xml|borderStyle=solid}
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="download-x">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<non-jta-data-source>java:comp/env/jdbc/download-x</non-jta-data-source>
<class>ru.bazon.downloadx.entities.links.Download</class>
<class>ru.bazon.downloadx.entities.links.Link</class>
<class>ru.bazon.downloadx.entities.pay.DownloadPayment</class>
<class>ru.bazon.downloadx.entities.pay.Payment</class>
<class>ru.bazon.downloadx.entities.security.Role</class>
<class>ru.bazon.downloadx.entities.security.User</class>
<class>ru.bazon.downloadx.entities.settings.SystemSettings</class>
<class>ru.bazon.downloadx.entities.settings.WebMoneySettings</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
<property name="openjpa.Multithreaded" value="true"/>
<property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>
<property name="openjpa.jdbc.EagerFetchMode" value="none"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true, PrettyPrint=true"/>
<property name="openjpa.DetachState" value="all"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
<property name="openjpa.InverseManager" value="true(Action=warn)"/>
</properties>
</persistence-unit>
</persistence>
{code}
{code:title=Payment.groovy|borderStyle=solid}
package ru.bazon.downloadx.entities.pay
import javax.persistence.CascadeType
import javax.persistence.Entity
import javax.persistence.EnumType
import javax.persistence.Enumerated
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.ManyToOne
import ru.bazon.downloadx.pay.PaymentType
import ru.indvdum.jpa.entities.AbstractEntity
@Entity
class Payment extends AbstractEntity {
@Id
@GeneratedValue
int id;
BigDecimal value = BigDecimal.ZERO;
BigDecimal senderBeforeCash = 0;
BigDecimal senderAfterCash = 0;
BigDecimal recipientBeforeCash = 0;
BigDecimal recipientAfterCash = 0;
String description;
Date createDate;
@Enumerated(EnumType.STRING)
PaymentType type = PaymentType.Transfer;
@ManyToOne(cascade = [CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH])
IPayable sender;
@ManyToOne(cascade = [CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH])
IPayable recipient;
@Override
public String toString() {
return "${value}";
}
}
{code}
{code:title=IPayable.java|borderStyle=solid}
package ru.bazon.downloadx.entities.pay;
import java.math.BigDecimal;
public interface IPayable {
BigDecimal getCash();
void setCash(BigDecimal cash);
}
{code}
{code:title=User.groovy|borderStyle=solid}
package ru.bazon.downloadx.entities.security
import javax.persistence.CascadeType
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.ManyToMany
import javax.persistence.OneToMany
import javax.persistence.Table
import javax.persistence.Temporal
import javax.persistence.TemporalType
import javax.persistence.Transient
import org.apache.openjpa.persistence.jdbc.Unique
import org.apache.shiro.authc.AuthenticationInfo
import org.apache.shiro.authc.SaltedAuthenticationInfo
import org.apache.shiro.authz.AuthorizationInfo
import org.apache.shiro.crypto.hash.Sha256Hash
import org.apache.shiro.subject.PrincipalCollection
import org.apache.shiro.subject.SimplePrincipalCollection
import org.apache.shiro.util.ByteSource
import org.apache.shiro.util.SimpleByteSource
import ru.bazon.downloadx.entities.links.Link
import ru.bazon.downloadx.entities.pay.IPayable
import ru.bazon.downloadx.security.Permit
import ru.indvdum.jpa.entities.AbstractEntity
@Entity
@Table(name = "users")
class User extends AbstractEntity implements IPayable, AuthorizationInfo, AuthenticationInfo, SaltedAuthenticationInfo {
@Id
@GeneratedValue
int id;
@Unique
String login;
String passwordHash;
String firstName;
String middleName;
String lastName;
String email;
String phone;
// TODO: reserve cash for link payments
BigDecimal cash = BigDecimal.ZERO;
Date registerDate;
Date repeatedDownloadsDate;
@Temporal(TemporalType.DATE)
Date birthDate;
@ManyToMany(fetch = FetchType.EAGER, cascade = [CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH])
Set<Role> userRoles = new HashSet<Role>();
@OneToMany(mappedBy = "user", orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
Set<Link> links = new HashSet<Link>();
public String getName() {
return "${firstName} ${middleName} ${lastName}";
}
public String setPassword(String password) {
Sha256Hash sha256Hash = new Sha256Hash(password, callMethod("getCredentialsSalt").getBytes());
passwordHash = sha256Hash.toHex();
return passwordHash;
}
@Transient
private String realmName;
public void setRealmName(String realmName) {
this.realmName = realmName;
}
@Override
public PrincipalCollection getPrincipals() {
return new SimplePrincipalCollection(id, realmName);
}
@Override
public Object getCredentials() {
return passwordHash;
}
@Override
public Collection<String> getStringPermissions() {
Set<String> permissionsNames = new HashSet<String>();
for (Role role : userRoles) {
for (Permit permit : role.getPermits()) {
permissionsNames.add(permit.getName());
}
}
return permissionsNames;
}
@Override
public Collection<Permit> getObjectPermissions() {
Set<Permit> permissions = new HashSet<Permit>();
for (Role role : userRoles) {
for (Permit permit : role.getPermits()) {
permissions.add(permit);
}
}
return permissions;
}
@Override
public ByteSource getCredentialsSalt() {
return new SimpleByteSource("random_salt_value_" + login);
}
@Override
public Collection<String> getRoles() {
Collection<String> roles = new HashSet<String>();
for (Role role : userRoles) {
roles.add(role.getName());
}
return roles;
}
public boolean isPermitted(Permit permission) {
for (Role role : userRoles) {
if (role.isPermitted(permission))
return true;
}
return false;
}
@Override
public String toString() {
return "${login}";
}
}
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira