HSAdmin Backend Domains, E-Mail, Datenbanken
Peter Hormanns
2010-10-04 a6c4debb06cf1471251cba4f5411d1ddea76ea47
Arbeit am member-Modul
1 files renamed
4 files added
33 files modified
1128 ■■■■ changed files
hsarback/src/de/hsadmin/cliClientConnector/ArgumentParser.java 4 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/cliClientConnector/CLIClientConnectorServlet.java 22 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/AbstractEntity.java 8 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/AbstractModuleImpl.java 36 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/AuthorisationException.java 8 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/EntitySessionHelper.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/GenericModuleImpl.java 16 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/ModuleInterface.java 14 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/SecureDefaultModuleImpl.java 28 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/Transaction.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/onetier/PersistenceManager.java 26 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/model/onetier/PersistenceManagerContextListener.java 23 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/EntityProcessorFactory.java 8 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/QueueTask.java 4 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/cust/BankAccount.java 93 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/cust/Contact.java 33 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/cust/Customer.java 67 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/cust/CustomerModuleImpl.java 7 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/cust/CustomersTariff.java 107 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/BaseComponent.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/Hive.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/INetAddress.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/pac/Pac.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/qstat/QTaskModuleImpl.java 4 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/user/UnixUser.java 2 ●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/user/UnixUserModuleImpl.java 22 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/user/UnixUserProcessorFactory.java 8 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/remote/AbstractRemote.java 43 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/remote/CustomerRemote.java 269 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/remote/QueueTaskRemote.java 8 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/remote/UnixUserRemote.java 8 ●●●● patch | view | raw | blame | history
hsarback/src/org/apache/xmlrpc/webserver/XmlRpcServlet.properties 1 ●●●● patch | view | raw | blame | history
hsarback/test/de/hsadmin/remote/CustomerTest.java 198 ●●●●● patch | view | raw | blame | history
hsarback/test/de/hsadmin/remote/QueueTaskTest.java 10 ●●●● patch | view | raw | blame | history
hsarback/test/de/hsadmin/remote/RemoteCASHelper.java 16 ●●●● patch | view | raw | blame | history
hsarback/test/de/hsadmin/remote/RemoteTest.java 1 ●●●● patch | view | raw | blame | history
hsarback/test/de/hsadmin/remote/UnixUserTest.java 18 ●●●● patch | view | raw | blame | history
hsarback/webapp/WEB-INF/web.xml 4 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/cliClientConnector/ArgumentParser.java
@@ -13,7 +13,7 @@
import de.hsadmin.cliClientConnector.CLIClientConnectorServlet.FunctionNotKnownException;
import de.hsadmin.cliClientConnector.CLIClientConnectorServlet.UnknownModuleException;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.ModuleInterface;
/**
@@ -98,7 +98,7 @@
                } else if( type.equals("java.util.Set") ) {
                    val = "<Set>";    
                } else try {
                    Entity v = (Entity)value;
                    AbstractEntity v = (AbstractEntity)value;
                    val = v.createStringKey();
                    if( deep && !foundObjects.contains(v) ) {
                        foundObjects.add(v);
hsarback/src/de/hsadmin/cliClientConnector/CLIClientConnectorServlet.java
@@ -16,7 +16,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.GenericModuleImpl;
import de.hsadmin.core.model.ModuleInterface;
import de.hsadmin.core.model.TicketAuthentication;
@@ -210,7 +210,7 @@
            String kname = hasGetter(eType, k);
            if (kname != null) {
                rval += (first ? "" : " and ") 
                    + "(obj." + Entity.escapeString(kname) + " = '" + Entity.escapeString(where.get(k)) + "')";
                    + "(obj." + AbstractEntity.escapeString(kname) + " = '" + AbstractEntity.escapeString(where.get(k)) + "')";
                first = false;
            }
        }
@@ -250,7 +250,7 @@
        Transaction transaction = module.getTransaction();
        transaction.beginTransaction();
        try {
            Method m = module.getClass().getMethod("add", Entity.class);
            Method m = module.getClass().getMethod("add", AbstractEntity.class);
            Object o = cls.newInstance();
            setValues(o, set, module);
            m.invoke(module, o);
@@ -278,11 +278,11 @@
    }
    // / checks wheather all 'oids' are in 'list'
    private void checkOids(List<Entity> list, List<String> oids) {
    private void checkOids(List<AbstractEntity> list, List<String> oids) {
        List<String> oidsNotFound = new ArrayList<String>();
        for (String id : oids) {
            boolean found = false;
            for (Entity e : list) {
            for (AbstractEntity e : list) {
                String foundKey = e.createStringKey();
                if (foundKey.equals(id)) {
                    found = true;
@@ -310,12 +310,12 @@
        try {
            Method m = module.getClass().getMethod("search", Class.class,
                    String.class, String.class);
            List<Entity> list = (List<Entity>) m.invoke(module, cls,
            List<AbstractEntity> list = (List<AbstractEntity>) m.invoke(module, cls,
                    buildQuery(cls, where, oids), null);
            checkOids(list, oids);
            Method m2 = module.getClass().getMethod("update", Entity.class);
            Method m2 = module.getClass().getMethod("update", AbstractEntity.class);
            for (int i = 0; i < list.size(); i++) {
                Entity entity = list.get(i);
                AbstractEntity entity = list.get(i);
                tx.detach(entity);
                setValues(entity, set, module);
                m2.invoke(module, entity);
@@ -341,10 +341,10 @@
        try {
            Method m = 
                module.getClass().getMethod("search", Class.class, String.class, String.class);
            List<Entity> list =
                (List<Entity>) m.invoke(module, cls, buildQuery(cls, where, oids), null);
            List<AbstractEntity> list =
                (List<AbstractEntity>) m.invoke(module, cls, buildQuery(cls, where, oids), null);
            checkOids(list, oids);
            Method m2 = module.getClass().getMethod("delete", Entity.class);
            Method m2 = module.getClass().getMethod("delete", AbstractEntity.class);
            for (int i = 0; i < list.size(); i++) {
                Object o = list.get(i);
                m2.invoke(module, o);
hsarback/src/de/hsadmin/core/model/AbstractEntity.java
File was renamed from hsarback/src/de/hsadmin/core/model/Entity.java
@@ -9,7 +9,7 @@
import de.hsadmin.mods.user.UnixUser;
public abstract class Entity {
public abstract class AbstractEntity {
    
    /**
     * trims whitespace from both ends, but a null remains null.
@@ -137,7 +137,7 @@
     * @param entity
     * @return
     */
    public boolean sameIdAs(Entity entity) {
    public boolean sameIdAs(AbstractEntity entity) {
        if (entity == null)
            return false;
        if (getClass() != entity.getClass())
@@ -183,7 +183,7 @@
     * @param em
     * @param loginUser
     */
    public Entity merge(EntityManager em, UnixUser loginUser) {
    public AbstractEntity merge(EntityManager em, UnixUser loginUser) {
        return em.merge(this);
    }
@@ -228,7 +228,7 @@
     * JBoss 5.1.
     * This is just for testing, it does not use the proper class loader!
     */
    public <T extends Entity> T replicate() {
    public <T extends AbstractEntity> T replicate() {
        try {
            ByteArrayOutputStream baOut = new ByteArrayOutputStream();
            ObjectOutputStream oOut = new ObjectOutputStream(baOut);
hsarback/src/de/hsadmin/core/model/AbstractModuleImpl.java
@@ -39,7 +39,7 @@
     * @return
     */
    private String restrict(Class<?> entityClass, UnixUser loginUser, String condition) {
        String restriction = Entity.restriction(entityClass, loginUser);
        String restriction = AbstractEntity.restriction(entityClass, loginUser);
        if (restriction == null)
            return condition;
        if (condition != null && condition.length() > 0)
@@ -53,13 +53,13 @@
        return transaction;
    }
    
    public Entity initialize(Entity newEntity)
    public AbstractEntity initialize(AbstractEntity newEntity)
            throws AuthorisationException {
        newEntity.initialize(transaction.getEntityManager(), getLoginUser());
        return newEntity;
    }
    public Entity add(Entity newEntity) throws HSAdminException {
    public AbstractEntity add(AbstractEntity newEntity) throws HSAdminException {
        // get the user who is logged in
        UnixUser loginUser = getLoginUser();
@@ -95,8 +95,8 @@
        return newEntity;
    }
    public Entity find(Class<? extends Entity> entityClass, Object key) throws HSAdminException {
        Entity entity = transaction.getEntityManager().find(entityClass, key);
    public AbstractEntity find(Class<? extends AbstractEntity> entityClass, Object key) throws HSAdminException {
        AbstractEntity entity = transaction.getEntityManager().find(entityClass, key);
        // check rights
        UnixUser loginUser = getLoginUser();
@@ -106,7 +106,7 @@
        return entity;
    }
    public Entity findByString(Class<? extends Entity> entityClass, String key) throws HSAdminException {
    public AbstractEntity findByString(Class<? extends AbstractEntity> entityClass, String key) throws HSAdminException {
        // find a static method which creates the query
        java.lang.reflect.Method method = null;
        try {
@@ -117,7 +117,7 @@
            method = null;
        }
        Entity entity;
        AbstractEntity entity;
        if (method == null)
            entity = transaction.getEntityManager().find(entityClass, key);
        else {
@@ -131,7 +131,7 @@
            }
            // perform the query
            List<Entity> result = search(entityClass, query, null);
            List<AbstractEntity> result = search(entityClass, query, null);
            if (result.size() > 1)
                throw new javax.persistence.NonUniqueResultException();
            if (result.size() == 0)
@@ -147,7 +147,7 @@
        return entity;
    }
    public List<Entity> search(Class<? extends Entity> entityClass, String condition, String orderBy) throws HSAdminException {
    public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass, String condition, String orderBy) throws HSAdminException {
        // restrict query
        UnixUser loginUser = getLoginUser();
        condition = restrict(entityClass, loginUser, condition);
@@ -161,7 +161,7 @@
        // Fix problem with queries WHERE .. AND (FALSE) -- pe
        if (condition != null && condition.contains("AND (FALSE)")) {
            return new LinkedList<Entity>();
            return new LinkedList<AbstractEntity>();
        }
        
        if (orderBy != null) {
@@ -181,12 +181,12 @@
        // do query
        try {
            List<?> res = query.getResultList();
            List<Entity> ret = new LinkedList<Entity>();
            List<AbstractEntity> ret = new LinkedList<AbstractEntity>();
            // remove entities where login user has no access rights
            for (Object entity : res) {
                if (entity instanceof Entity) {
                    Entity returnedEntity = (Entity) entity;
                if (entity instanceof AbstractEntity) {
                    AbstractEntity returnedEntity = (AbstractEntity) entity;
                    if (returnedEntity.isReadAllowedFor(getLoginUser())) {
                        ret.add(returnedEntity);
                    }
@@ -196,11 +196,11 @@
            // return clean result
            return ret;
        } catch (Exception ex) {
            return null;
            throw new HSAdminException(ex);
        }
    }
    public Entity update(Entity existingEntity) throws HSAdminException {
    public AbstractEntity update(AbstractEntity existingEntity) throws HSAdminException {
        // get the user who is logged in
        UnixUser loginUser = getLoginUser();
@@ -236,7 +236,7 @@
        return existingEntity;
    }
    public void delete(Entity existingEntity) throws HSAdminException {
    public void delete(AbstractEntity existingEntity) throws HSAdminException {
        // get the user who is logged in
        UnixUser user = getLoginUser();
@@ -280,7 +280,7 @@
        queueProcessor(proc, user, existingEntity, "geloescht");
    }
    public EntityProcessorFactory createProcessorFactory(Class<? extends Entity> entityClass) {
    public EntityProcessorFactory createProcessorFactory(Class<? extends AbstractEntity> entityClass) {
        try {
            String procFactName = entityClass.getCanonicalName()
                    + "ProcessorFactory";
@@ -310,7 +310,7 @@
        return loginUser;
    }
    public void queueProcessor(Processor proc, UnixUser user, Entity entity, String action) {
    public void queueProcessor(Processor proc, UnixUser user, AbstractEntity entity, String action) {
        log.debug("queueing processor for user " + user.getId() + "/"
                + user.getUserId() + "/" + user.getName());
        EntityInfo entityInfo = 
hsarback/src/de/hsadmin/core/model/AuthorisationException.java
@@ -8,7 +8,7 @@
    private UnixUser user;
    private String method;
    private Entity entity;
    private AbstractEntity entity;
    private String field;
    public UnixUser getUser() {
@@ -19,7 +19,7 @@
        return method;
    }
    public Entity getEntity() {
    public AbstractEntity getEntity() {
        return entity;
    }
@@ -34,7 +34,7 @@
        this.method = method;
    }
    public AuthorisationException(UnixUser user, String method, Entity entity) {
    public AuthorisationException(UnixUser user, String method, AbstractEntity entity) {
        super("nicht authorisiert fuer " + method + "("
                + entity.createStringKey() + ")");
@@ -43,7 +43,7 @@
        this.entity = entity;
    }
    public AuthorisationException(UnixUser user, String method, Entity entity,
    public AuthorisationException(UnixUser user, String method, AbstractEntity entity,
            String field) {
        super("nicht authorisiert fuer " + method + "("
                + entity.createStringKey() + "." + field + ")");
hsarback/src/de/hsadmin/core/model/EntitySessionHelper.java
@@ -13,7 +13,7 @@
     * @param entityClass
     * @return
     */
    public static AbstractModuleImpl createEntitySessionWrapper(Class<? extends Entity> entityClass) {
    public static AbstractModuleImpl createEntitySessionWrapper(Class<? extends AbstractEntity> entityClass) {
        // get in instance
        AbstractModuleImpl impl = null;
        try {
hsarback/src/de/hsadmin/core/model/GenericModuleImpl.java
@@ -20,7 +20,7 @@
    }
    @Override
    public Entity initialize(Entity newEntity) throws HSAdminException {
    public AbstractEntity initialize(AbstractEntity newEntity) throws HSAdminException {
        log.trace("initialize(" + newEntity + ")");
        AbstractModuleImpl wrapper = 
            EntitySessionHelper.createEntitySessionWrapper(newEntity.getClass());
@@ -29,14 +29,14 @@
    }
    @Override
    public Entity add(Entity newEntity) throws HSAdminException {
    public AbstractEntity add(AbstractEntity newEntity) throws HSAdminException {
        if (!newEntity.isNew())
            throw new HSAdminException("cannot add an already persistent entity");
        log.trace("add(" + newEntity + ")");
        AbstractModuleImpl wrapper = 
            EntitySessionHelper.createEntitySessionWrapper(newEntity.getClass());
        wrapper.construct(tx);
        Entity result = null;
        AbstractEntity result = null;
        try {
            result = wrapper.add(newEntity);
            return result;
@@ -46,7 +46,7 @@
    }
    @Override
    public Entity find(Class<? extends Entity> entityClass, Object key) throws HSAdminException {
    public AbstractEntity find(Class<? extends AbstractEntity> entityClass, Object key) throws HSAdminException {
        log.trace("find(" + entityClass + ", " + key + ")");
        AbstractModuleImpl wrapper = EntitySessionHelper.createEntitySessionWrapper(entityClass);
        wrapper.construct(tx);
@@ -54,7 +54,7 @@
    }
    @Override
    public Entity findByString(Class<? extends Entity> entityClass, String key) throws HSAdminException {
    public AbstractEntity findByString(Class<? extends AbstractEntity> entityClass, String key) throws HSAdminException {
        log.trace("find(" + entityClass + ", " + key + ")");
        AbstractModuleImpl wrapper = EntitySessionHelper.createEntitySessionWrapper(entityClass);
        wrapper.construct(tx);
@@ -62,7 +62,7 @@
    }
    @Override
    public List<Entity> search(Class<? extends Entity> entityClass, String condition, String orderBy) throws HSAdminException {
    public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass, String condition, String orderBy) throws HSAdminException {
        log.trace("search(" + entityClass + ", " + condition + ")");
        AbstractModuleImpl wrapper = EntitySessionHelper.createEntitySessionWrapper(entityClass);
        wrapper.construct(tx);
@@ -70,7 +70,7 @@
    }
    @Override
    public Entity update(Entity existingEntity) throws HSAdminException {
    public AbstractEntity update(AbstractEntity existingEntity) throws HSAdminException {
        if (existingEntity.isNew())
            return add(existingEntity);
        log.debug("update(" + existingEntity + ")");
@@ -84,7 +84,7 @@
    }
    @Override
    public void delete(Entity existingEntity) throws HSAdminException {
    public void delete(AbstractEntity existingEntity) throws HSAdminException {
        log.trace("delete(" + existingEntity + ")");
        AbstractModuleImpl wrapper = 
            EntitySessionHelper.createEntitySessionWrapper(existingEntity.getClass());
hsarback/src/de/hsadmin/core/model/ModuleInterface.java
@@ -14,37 +14,37 @@
    /**
     * initializes a newly created entity.
     */
    public Entity initialize(Entity newEntity) throws HSAdminException;
    public AbstractEntity initialize(AbstractEntity newEntity) throws HSAdminException;
    /**
     * Adds a new entity instance to the model.
     */
    public Entity add(Entity newEntity) throws HSAdminException;
    public AbstractEntity add(AbstractEntity newEntity) throws HSAdminException;
    /**
     * Finds an entity instance in the model, using its primary key.
     */
    public Entity find(Class<? extends Entity> entityClass, Object key) throws HSAdminException;
    public AbstractEntity find(Class<? extends AbstractEntity> entityClass, Object key) throws HSAdminException;
    /**
     * Finds an entity instance in the model, using its primary key in a String
     * representation.
     */
    public Entity findByString(Class<? extends Entity> entityClass, String key) throws HSAdminException;
    public AbstractEntity findByString(Class<? extends AbstractEntity> entityClass, String key) throws HSAdminException;
    /**
     * Searches entity instances in the model, using a simplified JPA-QL query.
     */
    public List<Entity> search(Class<? extends Entity> entityClass, String query, String orderBy) throws HSAdminException;
    public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass, String query, String orderBy) throws HSAdminException;
    /**
     * Updates an existing entity in the model.
     */
    public Entity update(Entity existingEntity) throws HSAdminException;
    public AbstractEntity update(AbstractEntity existingEntity) throws HSAdminException;
    /**
     * Deletes an existing entity from the model.
     */
    public void delete(Entity existingEntity) throws HSAdminException;
    public void delete(AbstractEntity existingEntity) throws HSAdminException;
}
hsarback/src/de/hsadmin/core/model/SecureDefaultModuleImpl.java
@@ -11,28 +11,28 @@
    private static final long serialVersionUID = 4567381515459292565L;
    @Override
    public Entity initialize(Entity newEntity) throws AuthorisationException {
    public AbstractEntity initialize(AbstractEntity newEntity) throws AuthorisationException {
        return super.initialize(newEntity);
    }
    @Override
    public Entity find(Class<? extends Entity> entityClass, Object key) throws HSAdminException {
        Entity entity = super.find(entityClass, key);
    public AbstractEntity find(Class<? extends AbstractEntity> entityClass, Object key) throws HSAdminException {
        AbstractEntity entity = super.find(entityClass, key);
        if (entity != null && !entity.isReadAllowedFor(getLoginUser()))
            throw new AuthorisationException(getLoginUser(), "find");
        return entity;
    }
    @Override
    public Entity findByString(Class<? extends Entity> entityClass, String key) throws HSAdminException {
        Entity entity = super.findByString(entityClass, key);
    public AbstractEntity findByString(Class<? extends AbstractEntity> entityClass, String key) throws HSAdminException {
        AbstractEntity entity = super.findByString(entityClass, key);
        if (entity != null && !entity.isReadAllowedFor(getLoginUser()))
            throw new AuthorisationException(getLoginUser(), "findByString");
        return entity;
    }
    @Override
    public List<Entity> search(Class<? extends Entity> entityClass, String condition, String orderBy)
    public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass, String condition, String orderBy)
            throws HSAdminException {
        // restrict query to entities where the loginUser could have rights on
        SearchFilter filterAnnot;
@@ -47,13 +47,13 @@
        }
        // do query
        List<Entity> res = super.search(entityClass, condition, orderBy);
        List<Entity> ret = new LinkedList<Entity>();
        List<AbstractEntity> res = super.search(entityClass, condition, orderBy);
        List<AbstractEntity> ret = new LinkedList<AbstractEntity>();
        // remove entities where login user has no access rights
        if (res != null) {
            for (Entity entity : res) {
                Entity returnedEntity = entity;
            for (AbstractEntity entity : res) {
                AbstractEntity returnedEntity = entity;
                if (returnedEntity.isReadAllowedFor(getLoginUser()))
                    ret.add(returnedEntity);
            }
@@ -77,21 +77,21 @@
    }
    @Override
    public Entity add(Entity newEntity) throws HSAdminException {
    public AbstractEntity add(AbstractEntity newEntity) throws HSAdminException {
        // access rights checking is done by base class
        return super.add(newEntity);
    }
    @Override
    public Entity update(Entity existingEntity) throws HSAdminException {
    public AbstractEntity update(AbstractEntity existingEntity) throws HSAdminException {
        // access rights checking is done by base class
        return super.update(existingEntity);
    }
    @Override
    public void delete(Entity detachedEntity) throws HSAdminException {
    public void delete(AbstractEntity detachedEntity) throws HSAdminException {
        // get the entity from the database
        Entity attachedEntity = getTransaction().getEntityManager().find(detachedEntity.getClass(),
        AbstractEntity attachedEntity = getTransaction().getEntityManager().find(detachedEntity.getClass(),
                detachedEntity.id());
        // does the login user have the right to delete?
hsarback/src/de/hsadmin/core/model/Transaction.java
@@ -150,7 +150,7 @@
     * Used to detach entities before update. Makes it possible to compare
     * old and new attribute values. 
     */
    public void detach(Entity entity) {
    public void detach(AbstractEntity entity) {
        // TODO: replace hibernate specific implmentation
//        org.hibernate.Session hSession = (Session) entityManager.getDelegate();
//        hSession.evict(entity);
hsarback/src/de/hsadmin/core/model/onetier/PersistenceManager.java
@@ -13,6 +13,15 @@
    
    private Map<String, EntityManagerFactory> persistenceUnits;
    
    public static EntityManager getEntityManager(String persistUnitName) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEMF(persistUnitName);
        return emf.createEntityManager();
    }
    public static void close() {
        getInstance().closeFactories();
    }
    private PersistenceManager() {
        persistenceUnits = new HashMap<String, EntityManagerFactory>();
    }
@@ -26,18 +35,19 @@
        return emf;
    }
    public static EntityManager getEntityManager(String persistUnitName) {
        PersistenceManager pm = PersistenceManager.getInstance();
        EntityManagerFactory emf = pm.getEMF(persistUnitName);
        return emf.createEntityManager();
    }
    private static PersistenceManager getInstance() {
        if (instance == null) {
            instance = new PersistenceManager();
        }
        return instance;
    }
    private void closeFactories() {
        for (String puName : persistenceUnits.keySet()) {
            System.out.println("Persistence Unit: " + puName);
            EntityManagerFactory emf = persistenceUnits.get(puName);
            emf.close();
            persistenceUnits.remove(puName);
        }
    }
}
hsarback/src/de/hsadmin/core/model/onetier/PersistenceManagerContextListener.java
New file
@@ -0,0 +1,23 @@
package de.hsadmin.core.model.onetier;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class PersistenceManagerContextListener implements ServletContextListener {
    public PersistenceManagerContextListener() {
    }
    @Override
    public void contextDestroyed(ServletContextEvent contextEvent) {
        System.out.println("PersistenceManager.contextDestroyed()");
        PersistenceManager.close();
    }
    @Override
    public void contextInitialized(ServletContextEvent contextEvent) {
        // do nothing
    }
}
hsarback/src/de/hsadmin/core/qserv/EntityProcessorFactory.java
@@ -2,7 +2,7 @@
import javax.persistence.EntityManager;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
/**
 * Most processor factories need only these methods.
@@ -10,13 +10,13 @@
 * @author peter
 */
public interface EntityProcessorFactory {
    public <T extends Entity> Processor createCreateProcessor(EntityManager em,
    public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em,
            T entity) throws ProcessorException;
    public <T extends Entity> Processor createUpdateProcessor(EntityManager em,
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em,
            T newEntity) throws ProcessorException;
    public <T extends Entity> Processor createDeleteProcessor(EntityManager em,
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em,
            T entity) throws ProcessorException;
}
hsarback/src/de/hsadmin/core/qserv/QueueTask.java
@@ -7,7 +7,7 @@
import javax.persistence.FetchType;
import javax.persistence.GenerationType;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.EntityInfo;
import de.hsadmin.core.model.ModuleImpl;
import de.hsadmin.mods.qstat.QTaskModuleImpl;
@@ -18,7 +18,7 @@
@javax.persistence.SequenceGenerator(name = "QueueTaskSeqGen", sequenceName = "queue_task_id_seq")
@EntityInfo(name = "Systemauftrag")
@ModuleImpl(QTaskModuleImpl.class)
public class QueueTask extends Entity implements Serializable {
public class QueueTask extends AbstractEntity implements Serializable {
    private static final long serialVersionUID = 2171870783383767875L;
hsarback/src/de/hsadmin/mods/cust/BankAccount.java
@@ -2,15 +2,56 @@
import static javax.persistence.FetchType.EAGER;
import javax.persistence.EntityManager;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.mods.user.UnixUser;
@javax.persistence.Entity(name = "BankAccounts")
@javax.persistence.Table(name = "bank_account")
public class BankAccount extends de.hsadmin.core.model.Entity implements
        java.io.Serializable {
@Entity(name = "BankAccounts")
@Table(name = "bank_account")
public class BankAccount extends AbstractEntity implements Serializable {
    private static final long serialVersionUID = 2965368183976686458L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "bank_account_id", columnDefinition = "integer")
    private long id;
    @JoinColumn(name = "bp_id", columnDefinition = "integer")
    @OneToOne(fetch = EAGER)
    private Customer customer;
    @Column(name = "autodebit_ga", columnDefinition = "boolean", nullable = true)
    private Boolean autoDebitGA;
    @Column(name = "autodebit_ar", columnDefinition = "boolean", nullable = true)
    private Boolean autoDebitAR;
    @Column(name = "autodebit_op", columnDefinition = "boolean", nullable = true)
    private Boolean autoDebitOP;
    @Column(name = "bank_customer", columnDefinition = "character varying(50)", nullable = true)
    private String bankCustomer;
    @Column(name = "bank_account", columnDefinition = "character varying(10)", nullable = true)
    private String bankAccount;
    @Column(name = "bank_code", columnDefinition = "character varying(8)", nullable = true)
    private String bankCode;
    @Column(name = "bank_name", columnDefinition = "character varying(50)", nullable = true)
    private String bankName;
    public static String createQueryFromStringKey(String humanKey) {
        return "customer.name = " + humanKey;
@@ -26,13 +67,6 @@
        return id;
    }
    // attribute id
    @javax.persistence.Id
    @javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE)
    @javax.persistence.SequenceGenerator(name = "bank_account_id_seq_gen", sequenceName = "bank_account_bank_account_i_seq", allocationSize = 20)
    @javax.persistence.Column(name = "bank_account_id", columnDefinition = "integer")
    private long id;
    public long getId() {
        return id;
    }
@@ -41,11 +75,6 @@
        this.id = id;
    }
    // attribute customer
    @javax.persistence.JoinColumn(name = "bp_id", columnDefinition = "integer")
    @javax.persistence.OneToOne(fetch = EAGER)
    private Customer customer;
    public Customer getCustomer() {
        return customer;
    }
@@ -53,10 +82,6 @@
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
    // attribute autoDebitGA
    @javax.persistence.Column(name = "autodebit_ga", columnDefinition = "boolean", nullable = true)
    private Boolean autoDebitGA;
    public Boolean isAutoDebitGA() {
        return autoDebitGA;
@@ -70,10 +95,6 @@
        this.autoDebitGA = autoDebitGA;
    }
    // attribute autoDebitAR
    @javax.persistence.Column(name = "autodebit_ar", columnDefinition = "boolean", nullable = true)
    private Boolean autoDebitAR;
    public Boolean isAutoDebitAR() {
        return autoDebitAR;
    }
@@ -85,10 +106,6 @@
    public void setAutoDebitAR(Boolean autoDebitAR) {
        this.autoDebitAR = autoDebitAR;
    }
    // attribute autoDebitOP
    @javax.persistence.Column(name = "autodebit_op", columnDefinition = "boolean", nullable = true)
    private Boolean autoDebitOP;
    public Boolean isAutoDebitOP() {
        return autoDebitOP;
@@ -102,10 +119,6 @@
        this.autoDebitOP = autoDebitOP;
    }
    // attribute bankCustomer
    @javax.persistence.Column(name = "bank_customer", columnDefinition = "character varying(50)", nullable = true)
    private String bankCustomer;
    public String getBankCustomer() {
        return bankCustomer;
    }
@@ -113,10 +126,6 @@
    public void setBankCustomer(String bankCustomer) {
        this.bankCustomer = bankCustomer;
    }
    // attribute bankAccount
    @javax.persistence.Column(name = "bank_account", columnDefinition = "character varying(10)", nullable = true)
    private String bankAccount;
    public String getBankAccount() {
        return bankAccount;
@@ -126,10 +135,6 @@
        this.bankAccount = bankAccount;
    }
    // attribute bankCode
    @javax.persistence.Column(name = "bank_code", columnDefinition = "character varying(8)", nullable = true)
    private String bankCode;
    public String getBankCode() {
        return bankCode;
    }
@@ -137,10 +142,6 @@
    public void setBankCode(String bankCode) {
        this.bankCode = bankCode;
    }
    // attribute bankName
    @javax.persistence.Column(name = "bank_name", columnDefinition = "character varying(50)", nullable = true)
    private String bankName;
    public String getBankName() {
        return bankName;
@@ -150,13 +151,11 @@
        this.bankName = bankName;
    }
    // / {$inheritDoc}
    @Override
    public boolean isNew() {
        return id == 0;
    }
    // / {@inheritDoc}
    @Override
    public UnixUser owningUser(EntityManager em) {
        return customer.owningUser(em);
hsarback/src/de/hsadmin/mods/cust/Contact.java
@@ -1,88 +1,72 @@
package de.hsadmin.mods.cust;
import static javax.persistence.FetchType.EAGER;
import static javax.persistence.GenerationType.SEQUENCE;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.GenerationType;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.mods.user.UnixUser;
@javax.persistence.Entity(name = "Contacts")
@javax.persistence.Table(name = "contact")
@javax.persistence.SequenceGenerator(name = "ContactsSeqGen", sequenceName = "contact_contact_id_seq")
public class Contact extends de.hsadmin.core.model.Entity implements
        java.io.Serializable {
public class Contact extends AbstractEntity implements Serializable {
    private static final long serialVersionUID = 9119607911598098558L;
    // attribute id
    @javax.persistence.Id
    @javax.persistence.GeneratedValue(strategy = SEQUENCE, generator = "ContactsSeqGen")
    @javax.persistence.GeneratedValue(strategy = GenerationType.IDENTITY)
    @javax.persistence.Column(name = "contact_id", columnDefinition = "integer")
    private long id;
    // attribute customer
    @javax.persistence.JoinColumn(name = "bp_id", columnDefinition = "integer")
    @javax.persistence.ManyToOne(fetch = EAGER)
    private Customer customer;
    // attribute salut
    @javax.persistence.Column(name = "salut", columnDefinition = "character varying(30)")
    private String salut;
    // attribute firstName
    @javax.persistence.Column(name = "first_name", columnDefinition = "character varying(40)")
    private String firstName;
    // attribute lastName
    @javax.persistence.Column(name = "last_name", columnDefinition = "character varying(40)")
    private String lastName;
    // attribute title
    @javax.persistence.Column(name = "title", columnDefinition = "character varying(20)")
    private String title;
    // attribute firma
    @javax.persistence.Column(name = "firma", columnDefinition = "character varying(120)")
    private String firma;
    // attribute co
    @javax.persistence.Column(name = "co", columnDefinition = "character varying(50)")
    private String co;
    // attribute street
    @javax.persistence.Column(name = "street", columnDefinition = "character varying(50)")
    private String street;
    // attribute zipCode
    @javax.persistence.Column(name = "zipcode", columnDefinition = "character varying(10)")
    private String zipCode;
    // attribute city
    @javax.persistence.Column(name = "city", columnDefinition = "character varying(40)")
    private String city;
    // attribute country
    @javax.persistence.Column(name = "country", columnDefinition = "character varying(30)")
    private String country;
    // attribute phonePrivate
    @javax.persistence.Column(name = "phone_private", columnDefinition = "character varying(30)")
    private String phonePrivate;
    // attribute phoneOffice
    @javax.persistence.Column(name = "phone_office", columnDefinition = "character varying(30)")
    private String phoneOffice;
    // attribute phoneMobile
    @javax.persistence.Column(name = "phone_mobile", columnDefinition = "character varying(30)")
    private String phoneMobile;
    // attribute fax
    @javax.persistence.Column(name = "fax", columnDefinition = "character varying(30)")
    private String fax;
    // attribute email
    @javax.persistence.Column(name = "email", columnDefinition = "character varying(50)")
    private String email;
@@ -115,18 +99,15 @@
        this.email = email;
    }
    // / {@inheritDoc}
    public static String createQueryFromStringKey(String humanKey) {
        return "name='" + humanKey + "'";
    }
    // / {@inheritDoc}
    @Override
    public String createStringKey() {
        return getCustomer().getName();
    }
    // / {@inheritDoc}
    @Override
    public long id() {
        return id;
@@ -268,13 +249,11 @@
        this.email = email;
    }
    // / {$inheritDoc}
    @Override
    public boolean isNew() {
        return id == 0;
    }
    // / {@inheritDoc}
    @Override
    public UnixUser owningUser(EntityManager em) {
        return null; // TODO: no access yet
hsarback/src/de/hsadmin/mods/cust/Customer.java
@@ -3,78 +3,83 @@
import static javax.persistence.CascadeType.ALL;
import static javax.persistence.FetchType.EAGER;
import static javax.persistence.FetchType.LAZY;
import static javax.persistence.GenerationType.SEQUENCE;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import de.hsadmin.mods.pac.Pac;
import de.hsadmin.mods.user.UnixUser;
@javax.persistence.Entity(name = "Customers")
@javax.persistence.Table(name = "business_partner")
@javax.persistence.SequenceGenerator(name = "CustomersSeqGen", sequenceName = "business_partner_bp_id_seq")
public class Customer extends de.hsadmin.core.model.Entity implements Serializable {
@Entity(name = "Customers")
@Table(name = "business_partner")
public class Customer extends de.hsadmin.core.model.AbstractEntity implements Serializable {
    private static final long serialVersionUID = -7450594652238392616L;
    @javax.persistence.Id
    @javax.persistence.GeneratedValue(strategy = SEQUENCE, generator = "CustomersSeqGen")
    @javax.persistence.Column(name = "bp_id", columnDefinition = "integer")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "bp_id", columnDefinition = "integer")
    private long id;
    @javax.persistence.Column(name = "member_id", columnDefinition = "integer")
    @Column(name = "member_id", columnDefinition = "integer")
    private int memberNo;
    @javax.persistence.Column(name = "member_code", columnDefinition = "character varying(20)")
    @Column(name = "member_code", columnDefinition = "character varying(20)")
    private String name;
    @javax.persistence.Column(name = "member_since", columnDefinition = "date", nullable = true)
    @Column(name = "member_since", columnDefinition = "date", nullable = true)
    private Date memberSince;
    @javax.persistence.Column(name = "member_until", columnDefinition = "date", nullable = true)
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "member_until", columnDefinition = "date", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date memberUntil;
    @javax.persistence.Column(name = "member_role", columnDefinition = "character varying(100)", nullable = true)
    @Column(name = "member_role", columnDefinition = "character varying(100)", nullable = true)
    private String memberRole;
    @javax.persistence.Column(name = "author_contract", columnDefinition = "date", nullable = true)
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "author_contract", columnDefinition = "date", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date authorContract;
    @javax.persistence.Column(name = "nondisc_contract", columnDefinition = "date", nullable = true)
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "nondisc_contract", columnDefinition = "date", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date nonDiscContract;
    @javax.persistence.Column(name = "shares_updated", columnDefinition = "date", nullable = true)
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "shares_updated", columnDefinition = "date", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date sharesUpdated;
    @javax.persistence.Column(name = "shares_signed", columnDefinition = "integer")
    @Column(name = "shares_signed", columnDefinition = "integer")
    private int sharesSigned;
    @javax.persistence.Column(name = "uid_vat", columnDefinition = "character varying(20)", nullable = true)
    @Column(name = "uid_vat", columnDefinition = "character varying(20)", nullable = true)
    private String uidVAT;
    @javax.persistence.OneToMany(fetch = EAGER, cascade = ALL, mappedBy = "customer")
    @OneToMany(fetch = EAGER, cascade = ALL, mappedBy = "customer")
    private Set<Contact> contacts;
    // virtual attribute bankAccount
    @javax.persistence.OneToOne(fetch = EAGER, cascade = ALL, mappedBy = "customer")
    @OneToOne(fetch = EAGER, cascade = ALL, mappedBy = "customer")
    private BankAccount bankAccount;
    // virtual attribute billData
    @javax.persistence.OneToOne(fetch = EAGER, cascade = ALL, mappedBy = "customer")
    @OneToOne(fetch = EAGER, cascade = ALL, mappedBy = "customer")
    private CustomersTariff billData;
    // virtual attribute pacs
    @javax.persistence.OneToMany(fetch = LAZY, cascade = ALL, mappedBy = "customer")
    @javax.persistence.OrderBy("name")
    @OneToMany(fetch = LAZY, cascade = ALL, mappedBy = "customer")
    @OrderBy("name")
    private Set<Pac> pacs;
    public Customer() {
@@ -262,6 +267,6 @@
    }
    
    public static String restriction() {
        return "name=:loginUserName";
        return "obj.name=:loginUserName";
    }
}
hsarback/src/de/hsadmin/mods/cust/CustomerModuleImpl.java
New file
@@ -0,0 +1,7 @@
package de.hsadmin.mods.cust;
import de.hsadmin.core.model.AbstractModuleImpl;
public class CustomerModuleImpl extends AbstractModuleImpl {
}
hsarback/src/de/hsadmin/mods/cust/CustomersTariff.java
@@ -1,23 +1,63 @@
package de.hsadmin.mods.cust;
import static javax.persistence.FetchType.EAGER;
import static javax.persistence.GenerationType.SEQUENCE;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.GenerationType;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.mods.user.UnixUser;
@javax.persistence.Entity(name = "CustomersTariffs")
@javax.persistence.Table(name = "billdata")
@javax.persistence.SequenceGenerator(name = "CustomersTariffsSeqGen", sequenceName = "billdata_billdata_id_seq")
public class CustomersTariff extends de.hsadmin.core.model.Entity implements
        java.io.Serializable {
public class CustomersTariff extends AbstractEntity implements Serializable {
    
    private static final long serialVersionUID = -3628577459027111705L;
    // / bean ctor
    @javax.persistence.Id
    @javax.persistence.GeneratedValue(strategy = GenerationType.IDENTITY)
    @javax.persistence.Column(name = "billdata_id", columnDefinition = "integer")
    private long id;
    @javax.persistence.JoinColumn(name = "bp_id", columnDefinition = "integer")
    @javax.persistence.OneToOne(fetch = EAGER)
    private Customer customer;
    @javax.persistence.Column(name = "tariff_domain_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date domainDiscountSince;
    @javax.persistence.Column(name = "tariff_domain_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date domainDiscountUntil;
    @javax.persistence.Column(name = "tariff_traffic_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date trafficDiscountSince;
    @javax.persistence.Column(name = "tariff_traffic_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date trafficDiscountUntil;
    @javax.persistence.Column(name = "tariff_quota_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date quotaDiscountSince;
    @javax.persistence.Column(name = "tariff_quota_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date quotaDiscountUntil;
    @javax.persistence.Column(name = "tariff_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date discountSince;
    @javax.persistence.Column(name = "tariff_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date discountUntil;
    public CustomersTariff() {
    }
@@ -25,28 +65,19 @@
        this.customer = cust;
    }
    // / {@inheritDoc}
    public static String createQueryFromStringKey(String humanKey) {
        return "customer.name = '" + humanKey + "'";
    }
    // / {@inheritDoc}
    @Override
    public String createStringKey() {
        return getCustomer().getName();
    }
    // / {@inheritDoc}
    @Override
    public long id() {
        return id;
    }
    // attribute id
    @javax.persistence.Id
    @javax.persistence.GeneratedValue(strategy = SEQUENCE, generator = "CustomersTariffsSeqGen")
    @javax.persistence.Column(name = "billdata_id", columnDefinition = "integer")
    private long id;
    public long getId() {
        return id;
@@ -56,12 +87,6 @@
        this.id = id;
    }
    // attribute customer
    @javax.persistence.JoinColumn(name = "bp_id", columnDefinition = "integer")
    @javax.persistence.OneToOne(fetch = EAGER)
    // TODO: das will ich gar nicht, geht aber nicht ohne?!?
    private Customer customer;
    public Customer getCustomer() {
        return customer;
    }
@@ -69,11 +94,6 @@
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
    // attribute domainDiscountSince
    @javax.persistence.Column(name = "tariff_domain_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date domainDiscountSince;
    public Date getDomainDiscountSince() {
        return domainDiscountSince;
@@ -83,11 +103,6 @@
        this.domainDiscountSince = domainDiscountSince;
    }
    // attribute domainDiscountUntil
    @javax.persistence.Column(name = "tariff_domain_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date domainDiscountUntil;
    public Date getDomainDiscountUntil() {
        return domainDiscountUntil;
    }
@@ -95,11 +110,6 @@
    public void setDomainDiscountUntil(Date domainDiscountUntil) {
        this.domainDiscountUntil = domainDiscountUntil;
    }
    // attribute trafficDiscountSince
    @javax.persistence.Column(name = "tariff_traffic_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date trafficDiscountSince;
    public Date getTrafficDiscountSince() {
        return trafficDiscountSince;
@@ -109,11 +119,6 @@
        this.trafficDiscountSince = trafficDiscountSince;
    }
    // attribute trafficDiscountUntil
    @javax.persistence.Column(name = "tariff_traffic_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date trafficDiscountUntil;
    public Date getTrafficDiscountUntil() {
        return trafficDiscountUntil;
    }
@@ -121,11 +126,6 @@
    public void setTrafficDiscountUntil(Date trafficDiscountUntil) {
        this.trafficDiscountUntil = trafficDiscountUntil;
    }
    // attribute quotaDiscountSince
    @javax.persistence.Column(name = "tariff_quota_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date quotaDiscountSince;
    public Date getQuotaDiscountSince() {
        return quotaDiscountSince;
@@ -135,11 +135,6 @@
        this.quotaDiscountSince = quotaDiscountSince;
    }
    // attribute quotaDiscountUntil
    @javax.persistence.Column(name = "tariff_quota_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date quotaDiscountUntil;
    public Date getQuotaDiscountUntil() {
        return quotaDiscountUntil;
    }
@@ -147,11 +142,6 @@
    public void setQuotaDiscountUntil(Date quotaDiscountUntil) {
        this.quotaDiscountUntil = quotaDiscountUntil;
    }
    // attribute discountSince
    @javax.persistence.Column(name = "tariff_discount_since", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date discountSince;
    public Date getDiscountSince() {
        return discountSince;
@@ -161,11 +151,6 @@
        this.discountSince = discountSince;
    }
    // attribute discountUntil
    @javax.persistence.Column(name = "tariff_discount_until", columnDefinition = "date")
    @javax.persistence.Temporal(javax.persistence.TemporalType.DATE)
    private Date discountUntil;
    public Date getDiscountUntil() {
        return discountUntil;
    }
@@ -174,13 +159,11 @@
        this.discountUntil = discountUntil;
    }
    // / {$inheritDoc}
    @Override
    public boolean isNew() {
        return id == 0;
    }
    // / {@inheritDoc}
    @Override
    public UnixUser owningUser(EntityManager em) {
        return customer.owningUser(em);
hsarback/src/de/hsadmin/mods/pac/BaseComponent.java
@@ -11,7 +11,7 @@
@javax.persistence.Entity(name = "BaseComponents")
@javax.persistence.Table(name = " basecomponent")
@javax.persistence.SequenceGenerator(name = "BaseComponentsSeqGen", sequenceName = "basecomponent_basecomponent_seq")
public class BaseComponent extends de.hsadmin.core.model.Entity implements Serializable {
public class BaseComponent extends de.hsadmin.core.model.AbstractEntity implements Serializable {
    
    private static final long serialVersionUID = -8161827018235142603L;
hsarback/src/de/hsadmin/mods/pac/Hive.java
@@ -15,7 +15,7 @@
@javax.persistence.Table(name="hive")
@javax.persistence.SequenceGenerator(name="HivesSeqGen", sequenceName="hive_hive_id_seq")
public class Hive
    extends de.hsadmin.core.model.Entity
    extends de.hsadmin.core.model.AbstractEntity
    implements java.io.Serializable
{
    private static final long serialVersionUID = -2270234313165009590L;
hsarback/src/de/hsadmin/mods/pac/INetAddress.java
@@ -10,7 +10,7 @@
@javax.persistence.Table(name="inet_addr")
@javax.persistence.SequenceGenerator(name="INetAddressesSeqGen", sequenceName="inet_addr_inet_addr_id_seq")
public class INetAddress
    extends de.hsadmin.core.model.Entity
    extends de.hsadmin.core.model.AbstractEntity
    implements java.io.Serializable
{
    private static final long serialVersionUID = -5792279453911426607L;
hsarback/src/de/hsadmin/mods/pac/Pac.java
@@ -17,7 +17,7 @@
@javax.persistence.Table(name = "packet")
@javax.persistence.SequenceGenerator(name = "PacsSeqGen", sequenceName = "packet_packet_id_seq")
@de.hsadmin.core.model.EntityInfo(name = "Paket")
public class Pac extends de.hsadmin.core.model.Entity implements Serializable {
public class Pac extends de.hsadmin.core.model.AbstractEntity implements Serializable {
    
    private static final long serialVersionUID = 1201899873300190132L;
hsarback/src/de/hsadmin/mods/qstat/QTaskModuleImpl.java
@@ -3,7 +3,7 @@
import java.util.List;
import de.hsadmin.core.model.AbstractModuleImpl;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.HSAdminException;
import de.hsadmin.mods.user.UnixUser;
@@ -15,7 +15,7 @@
    }
    @Override
    public List<Entity> search(Class<? extends Entity> entityClass, String condition, String orderBy) throws HSAdminException {
    public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass, String condition, String orderBy) throws HSAdminException {
        // do query and return result
        if (orderBy == null || orderBy.length() == 0) {
            orderBy = "ORDER BY obj.started DESC";
hsarback/src/de/hsadmin/mods/user/UnixUser.java
@@ -23,7 +23,7 @@
@Table(name = "unixuser")
@SequenceGenerator(name = "UnixUsersSeqGen", sequenceName = "unixuser_unixuser_id_seq")
@EntityInfo(name = "UNIX-Zugang/Mailbox")
public class UnixUser extends de.hsadmin.core.model.Entity implements Serializable {
public class UnixUser extends de.hsadmin.core.model.AbstractEntity implements Serializable {
    
    private static final long serialVersionUID = 7823071611805642906L;
hsarback/src/de/hsadmin/mods/user/UnixUserModuleImpl.java
@@ -7,7 +7,7 @@
import javax.persistence.Query;
import de.hsadmin.core.model.AuthorisationException;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.AbstractModuleImpl;
import de.hsadmin.core.model.HSAdminException;
import de.hsadmin.mods.pac.Pac;
@@ -20,14 +20,14 @@
    }
    @Override
    public Entity initialize(Entity newEntity) throws AuthorisationException {
    public AbstractEntity initialize(AbstractEntity newEntity) throws AuthorisationException {
        UnixUser newUnixUser = (UnixUser) super.initialize(newEntity);
        newUnixUser.setName(getLoginUser().getPac().getName() + '-');
        return newUnixUser;
    }
    @Override
    public Entity find(Class<? extends Entity> entityClass, Object key) throws HSAdminException {
    public AbstractEntity find(Class<? extends AbstractEntity> entityClass, Object key) throws HSAdminException {
        // do query
        UnixUser res = (UnixUser) super.find(entityClass, key);
@@ -39,7 +39,7 @@
    }
    @Override
    public Entity findByString(Class<? extends Entity> entityClass, String key) throws HSAdminException {
    public AbstractEntity findByString(Class<? extends AbstractEntity> entityClass, String key) throws HSAdminException {
        // do query
        UnixUser res = (UnixUser) super.findByString(entityClass, key);
@@ -49,17 +49,17 @@
    }
    @Override
    public List<Entity> search(Class<? extends Entity> entityClass, String condition, String orderBy) throws HSAdminException {
    public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass, String condition, String orderBy) throws HSAdminException {
        // do query
        if (orderBy == null || orderBy.length() == 0) {
            orderBy = "ORDER BY obj.name ASC";
        }
        List<Entity> res = super.search(entityClass, condition, orderBy);
        List<Entity> ret = new LinkedList<Entity>();
        List<AbstractEntity> res = super.search(entityClass, condition, orderBy);
        List<AbstractEntity> ret = new LinkedList<AbstractEntity>();
        // remove entities where login user has no access rights
        if (res != null) {
            for (Entity entity : res) {
            for (AbstractEntity entity : res) {
                try {
                    UnixUser returnedUnixUser = (UnixUser) entity;
                    needsPartialAccessOnPacOf(returnedUnixUser, "search");
@@ -74,7 +74,7 @@
    }
    @Override
    public Entity add(Entity newEntity) throws HSAdminException {
    public AbstractEntity add(AbstractEntity newEntity) throws HSAdminException {
        EntityManager em = getEntityManager();
        // only allow pac which matches the username (TODO: hard coded
        // Hostsharing convention)
@@ -143,7 +143,7 @@
    }
    @Override
    public Entity update(Entity existingEntity) throws HSAdminException {
    public AbstractEntity update(AbstractEntity existingEntity) throws HSAdminException {
        // get the entity from the database
        UnixUser detachedUnixUser = (UnixUser) existingEntity;
        UnixUser attachedUnixUser = getEntityManager().find(detachedUnixUser.getClass(),
@@ -202,7 +202,7 @@
    }
    @Override
    public void delete(Entity existingEntity) throws HSAdminException {
    public void delete(AbstractEntity existingEntity) throws HSAdminException {
        // get the entity from the database
        UnixUser detachedUnixUser = (UnixUser) existingEntity;
        UnixUser attachedUnixUser = getEntityManager().find(detachedUnixUser.getClass(),
hsarback/src/de/hsadmin/mods/user/UnixUserProcessorFactory.java
@@ -5,7 +5,7 @@
import javax.persistence.EntityManager;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.CompoundProcessor;
import de.hsadmin.core.qserv.EntityProcessorFactory;
import de.hsadmin.core.qserv.Processor;
@@ -22,7 +22,7 @@
    /** 
     * @return a Processor which creates a new UNIX user account
     */
    public <T extends Entity> Processor createCreateProcessor(EntityManager em,
    public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em,
            T entity) {
        UnixUser user = (UnixUser) entity;
        CompoundProcessor aCP = new CompoundProcessor(new ShellProcessor(
@@ -38,7 +38,7 @@
    /**
     *  @return a Processor which updates an existing UNIX user account
     */
    public <T extends Entity> Processor createUpdateProcessor(EntityManager em,
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em,
            T entity) {
        UnixUser user = (UnixUser) entity;
        CompoundProcessor aCP = new CompoundProcessor(new ShellProcessor(
@@ -55,7 +55,7 @@
    /**
     *  @return a Processor which deletes an existing UNIX user account
     */
    public <T extends Entity> Processor createDeleteProcessor(EntityManager em,
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em,
            T entity) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyMMdd-HHmm-");
        String trashPrefix = "/home/trash/" + sdf.format(new Date());
hsarback/src/de/hsadmin/remote/AbstractRemote.java
@@ -10,7 +10,7 @@
import de.hsadmin.core.model.AuthenticationException;
import de.hsadmin.core.model.AuthorisationException;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.GenericModuleImpl;
import de.hsadmin.core.model.HSAdminException;
import de.hsadmin.core.model.ModuleInterface;
@@ -26,17 +26,14 @@
        authentication = new TicketAuthentication();
    }
    protected abstract Class<? extends Entity> getEntityClass();
    protected abstract Class<? extends AbstractEntity> getEntityClass();
    protected abstract void entity2map(Entity entity, Map<String, String> resultMap);
    protected abstract void entity2map(AbstractEntity entity, Map<String, String> resultMap);
    
    protected abstract void map2entity(Map<String, String> setParams, Entity entity);
    protected abstract void map2entity(Map<String, String> setParams, AbstractEntity entity);
    protected abstract void regularizeKeys(Map<String, String> whereParams);
    
    /* (non-Javadoc)
     * @see de.hsadmin.remote.IRemote#search(java.lang.String, java.lang.String, java.util.Map)
     */
    public List<Map<String, String>> search(String runAsUser, String ticket,
            Map<String, String> whereParams) throws HSAdminException {
        String user = runAsUser;
@@ -46,10 +43,13 @@
                ModuleInterface module = new GenericModuleImpl(transaction);
                UnixUser unixUser = null;
                unixUser = (UnixUser) module.findByString(UnixUser.class, user);
                List<Entity> list = module.search(getEntityClass(),
                List<AbstractEntity> list = module.search(getEntityClass(),
                        buildQueryCondition(whereParams), null);
                if (list == null) {
                    throw new HSAdminException("result list is null, runtime-error?");
                }
                ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>();
                for (Entity e : list) {
                for (AbstractEntity e : list) {
                    HashMap<String, String> entry = new HashMap<String, String>();
                    entity2map(e, entry);
                    if (e.isReadAllowedFor(unixUser)) {
@@ -69,9 +69,6 @@
        }
    }
    /* (non-Javadoc)
     * @see de.hsadmin.remote.IRemote#add(java.lang.String, java.lang.String, java.util.Map)
     */
    public Map<String, String> add(String runAsUser, String ticket,
            Map<String, String> setParams) throws HSAdminException {
        String user = runAsUser;
@@ -79,12 +76,12 @@
        try {
            if (authentication.login(user, ticket)) {
                ModuleInterface module = new GenericModuleImpl(transaction);
                Constructor<? extends Entity> constructor =
                Constructor<? extends AbstractEntity> constructor =
                    getEntityClass().getConstructor();
                Entity entity = constructor.newInstance();
                AbstractEntity entity = constructor.newInstance();
                map2entity(setParams, entity);
                transaction.beginTransaction();
                Entity insertedEntity = module.add(entity);
                AbstractEntity insertedEntity = module.add(entity);
                transaction.commitTransaction();
                HashMap<String, String> entry = new HashMap<String, String>();
                entity2map(insertedEntity, entry);
@@ -99,9 +96,6 @@
        }
    }
    /* (non-Javadoc)
     * @see de.hsadmin.remote.IRemote#delete(java.lang.String, java.lang.String, java.util.Map)
     */
    public void delete(String runAsUser, String ticket,
            Map<String, String> whereParams) throws HSAdminException {
        String user = runAsUser;
@@ -116,10 +110,10 @@
                    throw new HSAdminException(
                            "better safe than sorry: no where parameter found");
                }
                List<Entity> list = module.search(getEntityClass(),
                List<AbstractEntity> list = module.search(getEntityClass(),
                        queryCondition, null);
                transaction.beginTransaction();
                for (Entity e : list) {
                for (AbstractEntity e : list) {
                    if (e.isWriteAllowedFor(unixUser)) {
                        module.delete(e);
                    } else {
@@ -139,9 +133,6 @@
        }
    }
    /* (non-Javadoc)
     * @see de.hsadmin.remote.IRemote#update(java.lang.String, java.lang.String, java.util.Map, java.util.Map)
     */
    public List<Map<String, String>> update(String runAsUser, String ticket,
            Map<String, String> setParams, Map<String, String> whereParams)
            throws HSAdminException {
@@ -158,10 +149,10 @@
                    throw new HSAdminException(
                            "better safe than sorry: no where parameter found");
                }
                List<Entity> list = module.search(getEntityClass(),
                        queryCondition, "ORDER BY name ASC");
                List<AbstractEntity> list = module.search(getEntityClass(),
                        queryCondition, "ORDER BY obj.name ASC");
                transaction.beginTransaction();
                for (Entity update : list) {
                for (AbstractEntity update : list) {
                    if (update.isWriteAllowedFor(unixUser)) {
                        transaction.detach(update);
                        map2entity(setParams, update);
hsarback/src/de/hsadmin/remote/CustomerRemote.java
New file
@@ -0,0 +1,269 @@
package de.hsadmin.remote;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.mods.cust.BankAccount;
import de.hsadmin.mods.cust.Contact;
import de.hsadmin.mods.cust.Customer;
public class CustomerRemote extends AbstractRemote {
    private static final DateFormat df = SimpleDateFormat.getDateInstance(DateFormat.SHORT);
    @Override
    protected Class<? extends AbstractEntity> getEntityClass() {
        return Customer.class;
    }
    @Override
    protected void entity2map(AbstractEntity entity,
            Map<String, String> resultMap) {
        Customer cust = (Customer) entity;
        resultMap.put("id", Long.toString(cust.getId()));
        resultMap.put("membercode", cust.getName());
        resultMap.put("memberno", Integer.toString(cust.getMemberNo()));
        Date memberSince = cust.getMemberSince();
        if (assertNotNull(memberSince)) {
            resultMap.put("membersince", df.format(memberSince));
        }
        Date memberUntil = cust.getMemberUntil();
        if (assertNotNull(memberUntil)) {
            resultMap.put("memberuntil", df.format(memberUntil));
        }
        resultMap.put("memberrole", cust.getMemberRole());
        Date authorContract = cust.getAuthorContract();
        if (assertNotNull(authorContract)) {
            resultMap.put("authorcontract", df.format(authorContract));
        }
        Date nonDiscContract = cust.getNonDiscContract();
        if (assertNotNull(nonDiscContract)) {
            resultMap.put("nondisccontract", df.format(nonDiscContract));
        }
        Date sharesUpdated = cust.getSharesUpdated();
        if (assertNotNull(sharesUpdated)) {
            resultMap.put("sharesupdated", df.format(sharesUpdated));
        }
        resultMap.put("sharessigned", Integer.toString(cust.getSharesSigned()));
        resultMap.put("uidvat", cust.getUidVAT());
        BankAccount bank = cust.getBankAccount();
        if (bank != null) {
            resultMap.put("autodebit_ga", bank.getAutoDebitGA() != null && bank.getAutoDebitGA() ? "Yes" : "No");
            resultMap.put("autodebit_ar", bank.getAutoDebitAR() != null && bank.getAutoDebitAR() ? "Yes" : "No");
            resultMap.put("autodebit_op", bank.getAutoDebitOP() != null && bank.getAutoDebitOP() ? "Yes" : "No");
            resultMap.put("bank_customer", bank.getBankCustomer());
            resultMap.put("bank_account", bank.getBankAccount());
            resultMap.put("bank_code", bank.getBankCode());
            resultMap.put("bank_name", bank.getBankName());
        }
        Set<Contact> contacts = cust.getContacts();
        if (contacts != null && !contacts.isEmpty()) {
            Contact c = contacts.iterator().next();
            resultMap.put("contact_salut", c.getSalut());
            resultMap.put("contact_title", c.getTitle());
            resultMap.put("contact_firstname", c.getFirstName());
            resultMap.put("contact_lastname", c.getLastName());
            resultMap.put("contact_firma", c.getFirma());
            resultMap.put("contact_co", c.getCo());
            resultMap.put("contact_street", c.getStreet());
            resultMap.put("contact_zipcode", c.getZipCode());
            resultMap.put("contact_city", c.getCity());
            resultMap.put("contact_country", c.getCountry());
            resultMap.put("contact_phone_private", c.getPhonePrivate());
            resultMap.put("contact_phone_office", c.getPhoneOffice());
            resultMap.put("contact_phone_mobile", c.getPhoneMobile());
            resultMap.put("contact_fax", c.getFax());
            resultMap.put("contact_email", c.getEmail());
        }
    }
    @Override
    protected void map2entity(Map<String, String> setParams,
            AbstractEntity entity) {
        Customer cust = (Customer) entity;
        String idStr = setParams.get("id");
        if (assertNotNull(idStr)) {
            cust.setId(Long.parseLong(idStr));
        }
        String memberCode = setParams.get("membercode");
        if (assertNotNull(memberCode)) {
            cust.setName(memberCode);
        }
        String memberNo = setParams.get("memberno");
        if (assertNotNull(memberNo)) {
            cust.setMemberNo(Integer.parseInt(memberNo));
        }
        String memberSince = setParams.get("membersince");
        if (assertNotNull(memberSince)) {
            try {
                cust.setMemberSince(df.parse(memberSince));
            } catch (ParseException e) {
                // don't care
            }
        }
        String memberUntil = setParams.get("memberuntil");
        if (assertNotNull(memberUntil)) {
            try {
                cust.setMemberUntil(df.parse(memberUntil));
            } catch (ParseException e) {
                // don't care
            }
        }
        String memberRole = setParams.get("memberrole");
        if (assertNotNull(memberRole)) {
            cust.setMemberRole(memberRole);
        }
        String authorContract = setParams.get("authorcontract");
        if (assertNotNull(authorContract)) {
            try {
                cust.setAuthorContract(df.parse(authorContract));
            } catch (ParseException e) {
                // don't care
            }
        }
        String nonDiscContract = setParams.get("nondisccontract");
        if (assertNotNull(nonDiscContract)) {
            try {
                cust.setNonDiscContract(df.parse(nonDiscContract));
            } catch (ParseException e) {
                // don't care
            }
        }
        String sharesUpdated = setParams.get("sharesupdated");
        if (assertNotNull(sharesUpdated)) {
            try {
                cust.setSharesUpdated(df.parse(sharesUpdated));
            } catch (ParseException e) {
                // don't care
            }
        }
        String sharesSigned = setParams.get("sharessigned");
        if (assertNotNull(sharesSigned)) {
            cust.setId(Integer.parseInt(sharesSigned));
        }
        String uidVat = setParams.get("uidvat");
        if (assertNotNull(uidVat)) {
            cust.setUidVAT(uidVat);
        }
        BankAccount bank = cust.getBankAccount();
        if (bank == null) {
            bank = new BankAccount();
            bank.setCustomer(cust);
            cust.setBankAccount(bank);
        }
        String autoDebitGA = setParams.get("autodebit_ga");
        if (assertNotNull(autoDebitGA)) {
            autoDebitGA = autoDebitGA.toUpperCase();
            bank.setAutoDebitGA(new Boolean(autoDebitGA.startsWith("T") || autoDebitGA.startsWith("Y")));
        }
        String autoDebitAR = setParams.get("autodebit_ar");
        if (assertNotNull(autoDebitAR)) {
            autoDebitAR = autoDebitAR.toUpperCase();
            bank.setAutoDebitAR(new Boolean(autoDebitAR.startsWith("T") || autoDebitAR.startsWith("Y")));
        }
        String autoDebitOP = setParams.get("autodebit_op");
        if (assertNotNull(autoDebitOP)) {
            autoDebitOP = autoDebitOP.toUpperCase();
            bank.setAutoDebitOP(new Boolean(autoDebitOP.startsWith("T") || autoDebitOP.startsWith("Y")));
        }
        String bankCustomer = setParams.get("bank_customer");
        if (assertNotNull(bankCustomer)) {
            bank.setBankCustomer(bankCustomer);
        }
        String bankAccount = setParams.get("bank_account");
        if (assertNotNull(bankAccount)) {
            bank.setBankAccount(bankAccount);
        }
        String bankCode = setParams.get("bank_code");
        if (assertNotNull(bankCode)) {
            bank.setBankCode(bankCode);
        }
        String bankName = setParams.get("bank_name");
        if (assertNotNull(bankName)) {
            bank.setBankName(bankName);
        }
        Set<Contact> contacts = cust.getContacts();
        Contact c = null;
        if (contacts == null || contacts.isEmpty()) {
            c = new Contact(cust);
            contacts.add(c);
        } else {
            c = contacts.iterator().next();
        }
        String salut = setParams.get("contact_salut");
        if (assertNotNull(salut)) {
            c.setSalut(salut);
        }
        String title = setParams.get("contact_title");
        if (assertNotNull(title)) {
            c.setTitle(title);
        }
        String firstName = setParams.get("contact_firstname");
        if (assertNotNull(firstName)) {
            c.setFirstName(firstName);
        }
        String lastName = setParams.get("contact_lastname");
        if (assertNotNull(lastName)) {
            c.setLastName(lastName);
        }
        String firma = setParams.get("contact_firma");
        if (assertNotNull(firma)) {
            c.setLastName(firma);
        }
        String co = setParams.get("contact_co");
        if (assertNotNull(co)) {
            c.setCo(co);
        }
        String street = setParams.get("contact_street");
        if (assertNotNull(street)) {
            c.setStreet(street);
        }
        String zipCode = setParams.get("contact_zipcode");
        if (assertNotNull(zipCode)) {
            c.setZipCode(zipCode);
        }
        String city = setParams.get("contact_city");
        if (assertNotNull(city)) {
            c.setCity(city);
        }
        String country = setParams.get("contact_country");
        if (assertNotNull(country)) {
            c.setCountry(country);
        }
        String phonePrivate = setParams.get("contact_phone_private");
        if (assertNotNull(phonePrivate)) {
            c.setPhonePrivate(phonePrivate);
        }
        String phoneOffice = setParams.get("contact_phone_office");
        if (assertNotNull(phoneOffice)) {
            c.setPhoneOffice(phoneOffice);
        }
        String phoneMobile = setParams.get("contact_phone_mobile");
        if (assertNotNull(phoneMobile)) {
            c.setPhoneMobile(phoneMobile);
        }
        String fax = setParams.get("contact_fax");
        if (assertNotNull(fax)) {
            c.setFax(fax);
        }
        String eMail = setParams.get("contact_email");
        if (assertNotNull(eMail)) {
            c.setEmail(eMail);
        }
}
    @Override
    protected void regularizeKeys(Map<String, String> whereParams) {
        // nothing to do
        replaceKey(whereParams, "membercode", "name");
        replaceKey(whereParams, "memberno", "memberNo");
        replaceKey(whereParams, "membersince", "memberSince");
        replaceKey(whereParams, "memberuntil", "memberUntil");
    }
}
hsarback/src/de/hsadmin/remote/QueueTaskRemote.java
@@ -5,7 +5,7 @@
import java.util.Date;
import java.util.Map;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.QueueTask;
public class QueueTaskRemote extends AbstractRemote {
@@ -13,12 +13,12 @@
    private static final DateFormat df = SimpleDateFormat.getDateInstance(DateFormat.SHORT);
    
    @Override
    protected Class<? extends Entity> getEntityClass() {
    protected Class<? extends AbstractEntity> getEntityClass() {
        return QueueTask.class;
    }
    @Override
    protected void entity2map(Entity entity, Map<String, String> resultMap) {
    protected void entity2map(AbstractEntity entity, Map<String, String> resultMap) {
        QueueTask task = (QueueTask) entity;
        resultMap.put("id", Long.toString(task.getId()));
        resultMap.put("status", task.getStatus().toString());
@@ -37,7 +37,7 @@
    }
    @Override
    protected void map2entity(Map<String, String> setParams, Entity entity) {
    protected void map2entity(Map<String, String> setParams, AbstractEntity entity) {
        // never used
    }
hsarback/src/de/hsadmin/remote/UnixUserRemote.java
@@ -2,18 +2,18 @@
import java.util.Map;
import de.hsadmin.core.model.Entity;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.mods.user.UnixUser;
public class UnixUserRemote extends AbstractRemote {
    @Override
    protected Class<? extends Entity> getEntityClass() {
    protected Class<? extends AbstractEntity> getEntityClass() {
        return UnixUser.class;
    }
    @Override
    protected void entity2map(Entity entity, Map<String, String> map) {
    protected void entity2map(AbstractEntity entity, Map<String, String> map) {
        UnixUser user = (UnixUser) entity;
        map.put("id", Long.toString(user.getId()));
        map.put("name", user.getName());
@@ -33,7 +33,7 @@
    }
    @Override
    protected void map2entity(Map<String, String> map, Entity entity) {
    protected void map2entity(Map<String, String> map, AbstractEntity entity) {
        UnixUser user = (UnixUser) entity;
        String id = map.get("id");
        if (assertNotNull(id)) {
hsarback/src/org/apache/xmlrpc/webserver/XmlRpcServlet.properties
@@ -1,2 +1,3 @@
member=de.hsadmin.remote.CustomerRemote
user=de.hsadmin.remote.UnixUserRemote
q=de.hsadmin.remote.QueueTaskRemote
hsarback/test/de/hsadmin/remote/CustomerTest.java
New file
@@ -0,0 +1,198 @@
package de.hsadmin.remote;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.Map;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CustomerTest {
    private static final String MODULE = "member";
    private XmlRpcClient client;
    private RemoteCASHelper cas;
    @Before
    public void setUp() throws Exception {
        client = RemoteTestHelper.getClient();
        cas = new RemoteCASHelper();
    }
    @After
    public void tearDown() throws Exception {
        client = null;
        cas = null;
    }
    @Test
    public void testAddAsHostmaster() {
        String user = "pe";
        int membersCount = -9999;
        try {
            membersCount = getMembersCount(user);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> setParams = new HashMap<String, String>();
        setParams.put("membercode", "hsh00-aaa");
        setParams.put("memberno", "20001");
        setParams.put("membersince", "01.10.2010");
        setParams.put("contact_salut", "Herr");
        setParams.put("contact_title", "Dr.");
        setParams.put("contact_firstname", "Rainer");
        setParams.put("contact_lastname", "Mustermann");
        setParams.put("contact_salut", "Herr");
        setParams.put("contact_street", "Hauptstr. 1");
        setParams.put("contact_zipcode", "99998");
        setParams.put("contact_city", "Musterstadt");
        setParams.put("contact_country", "D");
        setParams.put("contact_phone_private", "+49 9999 123456");
        setParams.put("contact_email", "rainer.mustermann@example.org");
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                setParams };
        try {
            client.execute(MODULE + ".add", params);
//            Object execute = client.execute(MODULE + ".add", params);
//            Map<?, ?> result = (Map<?, ?>) execute;
//            System.out.println(result);
            assertEquals(membersCount + 1, getMembersCount(user));
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    @Test
    public void testSearchAsHostmaster() {
        String user = "pe";
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        try {
            Object execute = client.execute(MODULE + ".search", params);
            Object[] result = (Object[]) execute;
            assertTrue(result.length > 100);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    @Test
    public void testSearchAsPacAdmin() {
        String user = "peh00";
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        try {
            Object execute = client.execute(MODULE + ".search", params);
            Object[] result = (Object[]) execute;
            assertTrue(result.length == 0);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    @Test
    public void testSearchAsPacUser() {
        String user = "peh00-phor";
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        try {
            Object execute = client.execute(MODULE + ".search", params);
            Object[] result = (Object[]) execute;
            assertTrue(result.length == 0);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    @Test
    public void testSearchAsMember() {
        String user = "hsh00-peh";
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        try {
            Object execute = client.execute(MODULE + ".search", params);
            Object[] result = (Object[]) execute;
            assertTrue(result.length == 1);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    @Test
    public void testDeleteAsMember() {
        String user = "hsh00-aaa";
        int membersCount = -9999;
        try {
            membersCount = getMembersCount(user);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        whereParams.put("membercode", "hsh00-aaa");
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        try {
            client.execute(MODULE + ".delete", params);
            assertEquals(membersCount - 1, getMembersCount(user));
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    @Test
    public void testDeleteAsHostmaster() {
        String user = "pe";
        int membersCount = -9999;
        try {
            membersCount = getMembersCount(user);
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        whereParams.put("membercode", "hsh00-aaa");
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        try {
            client.execute(MODULE + ".delete", params);
            assertEquals(membersCount - 1, getMembersCount(user));
        } catch (XmlRpcException e) {
            fail(e.getMessage());
        }
    }
    private int getMembersCount(String user) throws XmlRpcException {
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user,
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL),
                whereParams };
        Object execute = client.execute(MODULE + ".search", params);
        Object[] result = (Object[]) execute;
        return result.length;
    }
}
hsarback/test/de/hsadmin/remote/QueueTaskTest.java
@@ -36,7 +36,7 @@
    @Test
    public void testSearchAllAsPacAdmin() {
        String user = "peh00";
        String grantingTicketURL = cas.getGrantingTicketURL(user, user);
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user, 
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL), 
@@ -44,7 +44,7 @@
        try {
            Object execute = client.execute(MODULE + ".search", params);
            Object[] result = (Object[]) execute;
            assertTrue(result.length > 100);
            assertTrue(result.length > 20);
            for (Object o : result) {
                if (o instanceof Map<?, ?>) {
                    Map<?, ?> row = (Map<?, ?>) o;
@@ -61,7 +61,7 @@
    @Test
    public void testUpdate() {
        String user = "peh00";
        String grantingTicketURL = cas.getGrantingTicketURL(user, user);
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> setParams = new HashMap<String, String>();
        Map<String, String> whereParams = new HashMap<String, String>();
        setParams.put("details", "Test");
@@ -82,7 +82,7 @@
    @Test
    public void testCreateFails() {
        String user = "peh00";
        String grantingTicketURL = cas.getGrantingTicketURL(user, user);
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> setParams = new HashMap<String, String>();
        setParams.put("status", "done");
        setParams.put("title", "Test");
@@ -107,7 +107,7 @@
    @Test
    public void testDeleteAsPacAdminFails() {
        String user = "peh00";
        String grantingTicketURL = cas.getGrantingTicketURL(user, user);
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        whereParams.put("user", "peh00");
        Object[] params = new Object[] { user, 
hsarback/test/de/hsadmin/remote/RemoteCASHelper.java
@@ -34,20 +34,8 @@
        loginURL = config.getProperty("loginURL", LOGIN_URL);
    }
    
    public String getGrantingTicketURL(String user, String pw) {
        if ("peh00".equals(pw)) {
            pw = config.getProperty("peh00.passWord", "-");
        }
        if ("peh01".equals(pw)) {
            pw = config.getProperty("peh01.passWord", "-");
        }
        if ("pe".equals(pw)) {
            pw = config.getProperty("pe.passWord", "-");
        }
        if (user.equals(pw)) {
            System.err.println("Unknown Password for: " + pw);
            return null;
        }
    public String getGrantingTicketURL(String user) {
        String pw = config.getProperty(user + ".passWord", "-");
        try {
            String encodedParams = URLEncoder.encode("username", "UTF-8")
                + "=" + URLEncoder.encode(user, "UTF-8")
hsarback/test/de/hsadmin/remote/RemoteTest.java
@@ -5,6 +5,7 @@
@RunWith(Suite.class)
@Suite.SuiteClasses({
    CustomerTest.class,
    UnixUserTest.class,
//    MySqlDatabaseTest.class,
//    MySqlUserTest.class,
hsarback/test/de/hsadmin/remote/UnixUserTest.java
@@ -35,7 +35,7 @@
    @Test
    public void testSearchAsPacAdmin() {
        String user = "peh00";
        String grantingTicketURL = cas.getGrantingTicketURL(user, user);
        String grantingTicketURL = cas.getGrantingTicketURL(user);
        Map<String, String> whereParams = new HashMap<String, String>();
        Object[] params = new Object[] { user, 
                cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL), 
@@ -62,7 +62,7 @@
        int count = getObjectCount();
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> setParams = new HashMap<String, String>();
            setParams.put("name", "peh00-test2");
            setParams.put("password", "test123");
@@ -91,7 +91,7 @@
        int count = getObjectCount();
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> setParams = new HashMap<String, String>();
            setParams.put("name", "peh01-testfail");
            setParams.put("password", "test123");
@@ -112,7 +112,7 @@
        int count = getObjectCount();
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> setParams = new HashMap<String, String>();
            setParams.put("name", "peh00-langer-name");
            setParams.put("password", "test123");
@@ -133,7 +133,7 @@
        int count = getObjectCount();
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> whereParams = new HashMap<String, String>();
            Map<String, String> setParams = new HashMap<String, String>();
            whereParams.put("name", "peh00-test2");
@@ -167,7 +167,7 @@
        int count = getObjectCount();
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> whereParams = new HashMap<String, String>();
            whereParams.put("name", "peh00-langer-name");
            Object[] params = new Object[] { user, 
@@ -186,7 +186,7 @@
        int count = getObjectCount();
        try {
            String user = "peh01";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> whereParams = new HashMap<String, String>();
            whereParams.put("name", "peh00-test2");
            Object[] params = new Object[] { user, 
@@ -205,7 +205,7 @@
        int count = getObjectCount();
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> whereParams = new HashMap<String, String>();
            whereParams.put("name", "peh00-test2");
            Object[] params = new Object[] { user, 
@@ -223,7 +223,7 @@
        int count = -1;
        try {
            String user = "peh00";
            String grantingTicketURL = cas.getGrantingTicketURL(user, user);
            String grantingTicketURL = cas.getGrantingTicketURL(user);
            Map<String, String> whereParams = new HashMap<String, String>();
            Object[] params = new Object[] { user, 
                    cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.BACKEND_URL), 
hsarback/webapp/WEB-INF/web.xml
@@ -4,6 +4,10 @@
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <listener>
        <listener-class>de.hsadmin.core.model.onetier.PersistenceManagerContextListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>Queue Status Servlet</servlet-name>
        <servlet-class>de.hsadmin.core.qserv.QueueStatusReceiverServlet</servlet-class>