/META-INF/postgresql/persistence.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="postgresql" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!--
<class>xxx</class>
-->
<properties>
<property name="default" value="true" />
<property name="hibernate.connection.url" value="jdbc:postgresql://10.xx.xxx.xx:5432/xyz" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.password" value="****" />
<property name="hibernate.connection.username" value="****" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
</properties>
</persistence-unit>
</persistence>
UserDao
Code:
package at.vaeb.dls.dao;
import at.vaeb.dls.model.pg.User;
public interface UserDao extends BaseDao<User, String> {
User getUser(String userId);
User createUser(String svnr);
}
UserDaoImpl
Code:
package at.vaeb.dls.dao.impl;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import at.vaeb.dls.dao.UserDao;
import at.vaeb.dls.model.pg.User;
@Component
@Repository
public class UserDaoImpl implements UserDao {
private EntityManager em;
@PersistenceContext(name = "postgresql")
void setEntityManager(EntityManager em) {
this.em = em;
}
@Override
public User getUser(String id) {
return (User) this.em.find(User.class, id);
}
@Override
public User createUser(String svnr) {
User user = new User();
user.setUsername(svnr);
user.setDateCreated(new Timestamp(Calendar.getInstance()
.getTimeInMillis()));
return user;
}
@Override
public void persist(User entity) {
Timestamp oldDateUpdated = entity.getDateUpdated();
try {
entity.setDateUpdated(new Timestamp(Calendar.getInstance()
.getTimeInMillis()));
if (this.em.contains(entity))
this.em.persist(entity);
else
this.em.merge(entity);
// Here the TransactionRequiredException happens.
this.em.flush();
} catch (Exception e) {
entity.setDateUpdated(oldDateUpdated);
throw new RuntimeException(e);
}
}
@Override
@SuppressWarnings("unchecked")
public List<User> findAll() {
return this.em.createQuery("select u from User u").getResultList();
}
@Override
public User findById(String id) {
return this.em.find(User.class, id);
}
@Override
public void delete(User entity) {
this.em.remove(entity);
}
}
SecurityService
Code:
package at.vaeb.dls.service;
import at.vaeb.dls.model.pg.User;
public interface SecurityService {
User createOnlineAppUser(String svnr) throws SecurityServiceException;
User getUser(String testSvnr);
}
SecurityServiceImpl
Code:
package at.vaeb.dls.service.impl;
import java.util.HashSet;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import at.vaeb.dls.dao.AuthorityDao;
import at.vaeb.dls.dao.UserDao;
import at.vaeb.dls.model.pg.Authority;
import at.vaeb.dls.model.pg.User;
import at.vaeb.dls.service.SecurityService;
@Named("securityService")
@Singleton
public class SecurityServiceImpl implements SecurityService {
private static final Logger log = Logger
.getLogger(SecurityServiceImpl.class);
@Inject
UserDao userDao;
@Inject
AuthorityDao authorityDao;
@Override
@Transactional(propagation=Propagation.REQUIRED)
public User createOnlineAppUser(String svnr) {
// TODO svnr check
// TODO snvr check gegen service?
Authority authority = authorityDao.createAuthority(svnr, "ROLE_USER");
User user = userDao.createUser(svnr);
user.setAuthorities(new HashSet<Authority>());
authority.setUser(user);
user.getAuthorities().add(authority);
generatePassword(user);
userDao.persist(user);
return user;
}
private void generatePassword(User user) {
// TODO generate password und verschlüssel es
user.setPassword("passwort");
user.setClearTextPassword("passwort");
}
@Override
@Transactional(propagation=Propagation.REQUIRED)
public User getUser(String testSvnr) {
User user = userDao.findById(testSvnr);
if (user == null) {
log.info("User with svnr '" + testSvnr + "' not found.");
return null;
}
StringBuilder sb = new StringBuilder();
for (Authority a : user.getAuthorities()) {
sb.append(a + ", ");
}
log.info("User " + user.getUsername() + " has following authorities: "
+ sb.toString());
return user;
}
}
SecurityServiceTest
Code:
package at.vaeb.dls.service;
import javax.inject.Inject;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import at.vaeb.dls.model.pg.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/service.spring.xml")
public class SecurityServiceTest {
private static final String TEST_SVNR = "1234567890";
@Inject
SecurityService securityService;
@Test
public void dummyTest() {
try {
User origUser = securityService.createOnlineAppUser(TEST_SVNR);
User user = securityService.getUser(TEST_SVNR);
Assert.assertNotNull(user);
Assert.assertEquals(origUser.getUsername(), user.getUsername());
} catch (SecurityServiceException e) {
throw new RuntimeException(e);
}
System.out.println();
}
}