Commit aedf7b75 by Tuomas Riihimäki

Yhden illan koodit

1 parent ea0bd736
Showing with 578 additions and 146 deletions
No preview for this file type
...@@ -6,6 +6,11 @@ import java.util.List; ...@@ -6,6 +6,11 @@ import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal; import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal;
import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal.Right; import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal.Right;
...@@ -29,6 +34,8 @@ import fi.insomnia.bortal.model.User; ...@@ -29,6 +34,8 @@ import fi.insomnia.bortal.model.User;
@Stateless @Stateless
public class BillBean implements BillBeanLocal { public class BillBean implements BillBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(BillBean.class);
@EJB @EJB
private BillFacade billFacade; private BillFacade billFacade;
...@@ -46,7 +53,8 @@ public class BillBean implements BillBeanLocal { ...@@ -46,7 +53,8 @@ public class BillBean implements BillBeanLocal {
private EventFacade eventfacade; private EventFacade eventfacade;
@EJB @EJB
private BillLineFacade billLineFacade; private BillLineFacade billLineFacade;
@PersistenceContext
private EntityManager em;
/** /**
* Default constructor. * Default constructor.
*/ */
...@@ -108,7 +116,9 @@ public class BillBean implements BillBeanLocal { ...@@ -108,7 +116,9 @@ public class BillBean implements BillBeanLocal {
LanEvent event = eventbean.getCurrentEvent(); LanEvent event = eventbean.getCurrentEvent();
Bill ret = new Bill(event, shoppingUser); Bill ret = new Bill(event, shoppingUser);
billFacade.create(ret); billFacade.create(ret);
ret.setUser(shoppingUser);
em.flush();
logger.debug("Created bill with id {} and user {}", ret.getId(), ret.getUser());
return ret; return ret;
} }
...@@ -123,6 +133,8 @@ public class BillBean implements BillBeanLocal { ...@@ -123,6 +133,8 @@ public class BillBean implements BillBeanLocal {
} }
BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat()); BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat());
billLineFacade.create(line); billLineFacade.create(line);
line.setBill(bill);
em.flush();
return line; return line;
} }
......
...@@ -8,6 +8,7 @@ import javax.persistence.PersistenceContext; ...@@ -8,6 +8,7 @@ import javax.persistence.PersistenceContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.EventFacade; import fi.insomnia.bortal.facade.EventFacade;
import fi.insomnia.bortal.facade.EventOrganiserFacade; import fi.insomnia.bortal.facade.EventOrganiserFacade;
import fi.insomnia.bortal.model.EventOrganiser; import fi.insomnia.bortal.model.EventOrganiser;
...@@ -37,6 +38,8 @@ public class EventBean implements EventBeanLocal { ...@@ -37,6 +38,8 @@ public class EventBean implements EventBeanLocal {
private EventStatusBeanLocal eventStatusBean; private EventStatusBeanLocal eventStatusBean;
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@EJB
private SecurityBeanLocal secubean;
@Override @Override
public LanEvent getEventByHostname(String hostname) { public LanEvent getEventByHostname(String hostname) {
...@@ -79,15 +82,28 @@ public class EventBean implements EventBeanLocal { ...@@ -79,15 +82,28 @@ public class EventBean implements EventBeanLocal {
} }
public LanEvent getCurrentEvent() { public LanEvent getCurrentEvent() {
LanEvent ret = getEventByHostname( BortalLocalContextHolder.getHostname()); LanEvent ret = getEventByHostname(BortalLocalContextHolder.getHostname());
return ret; return ret;
} }
@Override @Override
public LanEvent mergeChanges(LanEvent event) { public LanEvent mergeChanges(LanEvent event) {
if(!userBean.isCurrentUser(event.getOrganiser().getAdmin()))
{
throw new PermissionDeniedException(secubean, userBean.getCurrentUser(), "User tried to merge event: " + event + " without being admin of that group");
}
return eventFacade.merge(event); return eventFacade.merge(event);
} }
@Override
public void create(LanEvent event) {
if (!userBean.isCurrentUser(event.getOrganiser().getAdmin())) {
throw new PermissionDeniedException(secubean, userBean.getCurrentUser(), "User tried to create a new event for organiser " + event.getOrganiser() + " without being admin of that group");
}
eventFacade.create(event);
}
} }
...@@ -4,8 +4,6 @@ import java.util.List; ...@@ -4,8 +4,6 @@ import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import fi.insomnia.bortal.exceptions.PermissionDeniedException; import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.EventOrganiserFacade; import fi.insomnia.bortal.facade.EventOrganiserFacade;
......
...@@ -3,7 +3,6 @@ package fi.insomnia.bortal.beans; ...@@ -3,7 +3,6 @@ package fi.insomnia.bortal.beans;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
......
...@@ -15,16 +15,13 @@ import javax.ejb.Stateless; ...@@ -15,16 +15,13 @@ import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.BeanRole;
import fi.insomnia.bortal.enums.Permission; import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.EventChildGenericFacade;
import fi.insomnia.bortal.facade.RoleFacade; import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.facade.RoleRightFacade; import fi.insomnia.bortal.facade.RoleRightFacade;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight; import fi.insomnia.bortal.model.RoleRight;
import fi.insomnia.bortal.model.User;
/** /**
* *
...@@ -33,7 +30,7 @@ import fi.insomnia.bortal.model.User; ...@@ -33,7 +30,7 @@ import fi.insomnia.bortal.model.User;
@Stateless @Stateless
public class RoleBean implements RoleBeanLocal { public class RoleBean implements RoleBeanLocal {
private static final String PUBLIC_ROLE_NAME = BeanRole.ANONYMOUS.toString(); // private static final String PUBLIC_ROLE_NAME = BeanRole.ANONYMOUS.toString();
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
......
...@@ -4,17 +4,9 @@ import java.util.Calendar; ...@@ -4,17 +4,9 @@ import java.util.Calendar;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.ejb.TransactionManagement; import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType; import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -39,8 +31,7 @@ public class SecurityBean implements SecurityBeanLocal { ...@@ -39,8 +31,7 @@ public class SecurityBean implements SecurityBeanLocal {
private LogEntryTypeFacade typeFacade; private LogEntryTypeFacade typeFacade;
@EJB @EJB
private LogEntryFacade entryFacade; private LogEntryFacade entryFacade;
@PersistenceContext
private EntityManager manager;
@Resource @Resource
UserTransaction utx; UserTransaction utx;
...@@ -78,8 +69,7 @@ public class SecurityBean implements SecurityBeanLocal { ...@@ -78,8 +69,7 @@ public class SecurityBean implements SecurityBeanLocal {
return logMessage(type, null, description); return logMessage(type, null, description);
} }
@Resource
private EJBContext context;
public LogEntry logMessage(SecurityLogType paramType, User user, String description) { public LogEntry logMessage(SecurityLogType paramType, User user, String description) {
LogEntry entry = null; LogEntry entry = null;
......
...@@ -23,15 +23,14 @@ import fi.insomnia.bortal.facade.BillLineFacade; ...@@ -23,15 +23,14 @@ import fi.insomnia.bortal.facade.BillLineFacade;
import fi.insomnia.bortal.facade.CompoEntryFacade; import fi.insomnia.bortal.facade.CompoEntryFacade;
import fi.insomnia.bortal.facade.CompoFacade; import fi.insomnia.bortal.facade.CompoFacade;
import fi.insomnia.bortal.facade.EventMapFacade; import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.facade.EventOrganiserFacade;
import fi.insomnia.bortal.facade.PlaceFacade; import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.Bill; import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine; import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.Compo; import fi.insomnia.bortal.model.Compo;
import fi.insomnia.bortal.model.CompoEntry; import fi.insomnia.bortal.model.CompoEntry;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Place; import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.BortalLocalContextHolder; import fi.insomnia.bortal.utilities.BortalLocalContextHolder;
...@@ -65,10 +64,6 @@ public class TestDataBean implements TestDataBeanLocal { ...@@ -65,10 +64,6 @@ public class TestDataBean implements TestDataBeanLocal {
private BillFacade billFacade; private BillFacade billFacade;
@EJB @EJB
private BillLineFacade billLineFacade; private BillLineFacade billLineFacade;
@EJB
private RoleBeanLocal role;
@EJB
private UserBeanLocal userbean;
// @PersistenceUnit // @PersistenceUnit
// private EntityManagerFactory emf; // private EntityManagerFactory emf;
...@@ -244,19 +239,6 @@ public class TestDataBean implements TestDataBeanLocal { ...@@ -244,19 +239,6 @@ public class TestDataBean implements TestDataBeanLocal {
return null; return null;
} }
/**
* Generate all metashit, ex. events.
*/
private User generateUser() {
User user = new User();
user.setNick("Nick");
user.setPassword("plaah");
userFacade.create(user);
return user;
}
public void generateTestPlaces(EventMap map) { public void generateTestPlaces(EventMap map) {
......
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.security.Principal; import java.security.Principal;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
...@@ -25,9 +24,11 @@ import fi.insomnia.bortal.exceptions.PermissionDeniedException; ...@@ -25,9 +24,11 @@ import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.RoleFacade; import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.facade.RoleRightFacade; import fi.insomnia.bortal.facade.RoleRightFacade;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.facade.UserImageFacade;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight; import fi.insomnia.bortal.model.RoleRight;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.utilities.BortalLocalContextHolder; import fi.insomnia.bortal.utilities.BortalLocalContextHolder;
/** /**
...@@ -40,9 +41,6 @@ public class UserBean implements UserBeanLocal { ...@@ -40,9 +41,6 @@ public class UserBean implements UserBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(UserBean.class); private static final Logger logger = LoggerFactory.getLogger(UserBean.class);
public static final String DEFAULT_USER_LOGIN = "ANONYMOUS"; public static final String DEFAULT_USER_LOGIN = "ANONYMOUS";
@EJB
private RoleRightFacade rrfacade;
/** /**
* Java EE container injektoi tämän luokkamuuttujan luokan luonnin * Java EE container injektoi tämän luokkamuuttujan luokan luonnin
* yhteydessä. * yhteydessä.
...@@ -55,15 +53,14 @@ public class UserBean implements UserBeanLocal { ...@@ -55,15 +53,14 @@ public class UserBean implements UserBeanLocal {
private SessionContext context; private SessionContext context;
@EJB @EJB
private RoleBeanLocal rolebean;
@EJB
private SecurityBeanLocal secubean; private SecurityBeanLocal secubean;
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
@EJB @EJB
private RoleFacade rolefacade; private RoleFacade rolefacade;
@EJB
private UserImageFacade userimagefacade;
/** /**
* Default constructor. * Default constructor.
...@@ -162,12 +159,13 @@ public class UserBean implements UserBeanLocal { ...@@ -162,12 +159,13 @@ public class UserBean implements UserBeanLocal {
// target, permission, ret }); // target, permission, ret });
// } // }
if (logger.isDebugEnabled()) { // if (logger.isDebugEnabled()) {
long diffMs = Calendar.getInstance().getTimeInMillis() - start.getTimeInMillis(); // long diffMs = Calendar.getInstance().getTimeInMillis() -
// start.getTimeInMillis();
// logger.debug("User {} Target {}, permission {} checktime {}ms result: {}", // logger.debug("User {} Target {}, permission {} checktime {}ms result: {}",
// new Object[] { user.getLogin(), target, permission, diffMs, ret // new Object[] { user.getLogin(), target, permission, diffMs, ret
// }); // });
} // }
// TODO: FIX THIS!! really bad idea.... // TODO: FIX THIS!! really bad idea....
if (user.isSuperadmin()) { if (user.isSuperadmin()) {
...@@ -243,4 +241,36 @@ public class UserBean implements UserBeanLocal { ...@@ -243,4 +241,36 @@ public class UserBean implements UserBeanLocal {
} }
} }
@Override
public UserImage uploadImage(Integer userid, String contentType, byte[] image, String filename, String description) {
fatalNotLoggedIn();
User user = getCurrentUser();
if (getCurrentUser().getId() != userid) {
fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "usert tried to save picture to userid " + userid + " without sufficient permissions!");
user = userFacade.find(userid);
}
UserImage userimage = new UserImage(user);
userimage.setMimeType(contentType);
userimage.setImageData(image);
userimage.setName(filename);
userimage.setDescription(description);
userimagefacade.create(userimage);
// setting uploaded image as the default.
user.setCurrentImage(userimage);
userFacade.merge(user);
return userimage;
}
@Override
public UserImage findUserImage(int id) {
UserImage ret = userimagefacade.find(id);
if (ret != null && !this.isCurrentUser(ret.getUser())) {
fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ, "Not enough rights to access image id: " + id + " for user " + ret.getUser());
}
return ret;
}
} }
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.List; import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.Bill; import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
...@@ -16,9 +20,13 @@ import fi.insomnia.bortal.model.User; ...@@ -16,9 +20,13 @@ import fi.insomnia.bortal.model.User;
@LocalBean @LocalBean
public class BillFacade extends EventChildGenericFacade<Bill> { public class BillFacade extends EventChildGenericFacade<Bill> {
private static final Logger logger = LoggerFactory.getLogger(BillFacade.class);
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@EJB
private UserFacade userfacade;
public BillFacade() { public BillFacade() {
super(Bill.class); super(Bill.class);
} }
...@@ -27,12 +35,21 @@ public class BillFacade extends EventChildGenericFacade<Bill> { ...@@ -27,12 +35,21 @@ public class BillFacade extends EventChildGenericFacade<Bill> {
return em; return em;
} }
public int getBiggestBillNumber(LanEvent e) { @Override
public void create(Bill entity)
{
super.create(entity);
userfacade.evict(entity.getUser());
}
public Integer getBiggestBillNumber(LanEvent e) {
TypedQuery<Integer> q = getEm().createNamedQuery("Bill.findbiggestBillNumber", Integer.class); TypedQuery<Integer> q = getEm().createNamedQuery("Bill.findbiggestBillNumber", Integer.class);
q.setParameter("event", e); q.setParameter("event", e);
return q.getSingleResult(); return getSingleNullableResult(q);
} }
} }
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
...@@ -13,10 +14,19 @@ public class BillLineFacade extends EventChildGenericFacade<BillLine> { ...@@ -13,10 +14,19 @@ public class BillLineFacade extends EventChildGenericFacade<BillLine> {
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@EJB
private BillFacade billfacade;
public BillLineFacade() { public BillLineFacade() {
super(BillLine.class); super(BillLine.class);
} }
public void create(BillLine entity)
{
super.create(entity);
billfacade.evict(entity.getBill());
}
protected EntityManager getEm() { protected EntityManager getEm() {
return em; return em;
} }
......
...@@ -101,8 +101,8 @@ public abstract class EventChildGenericFacade<T extends EventChildInterface> { ...@@ -101,8 +101,8 @@ public abstract class EventChildGenericFacade<T extends EventChildInterface> {
} }
protected T getSingleNullableResult(TypedQuery<T> q) { protected static <K> K getSingleNullableResult(TypedQuery<K> q) {
T ret = null; K ret = null;
try { try {
ret = q.getSingleResult(); ret = q.getSingleResult();
} catch (NoResultException e) { } catch (NoResultException e) {
...@@ -110,4 +110,9 @@ public abstract class EventChildGenericFacade<T extends EventChildInterface> { ...@@ -110,4 +110,9 @@ public abstract class EventChildGenericFacade<T extends EventChildInterface> {
} }
return ret; return ret;
} }
public void evict(T entity) {
if (entity != null && entity.getId() != null) {
getEm().getEntityManagerFactory().getCache().evict(getEntityClass(), entity.getId());
}
}
} }
...@@ -3,27 +3,19 @@ package fi.insomnia.bortal.facade; ...@@ -3,27 +3,19 @@ package fi.insomnia.bortal.facade;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.LockModeType;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
@Stateless @Stateless
@LocalBean @LocalBean
public class EventFacade extends GenericFacade<Integer, LanEvent> { public class EventFacade extends GenericFacade<Integer, LanEvent> {
private static final Logger logger = LoggerFactory.getLogger(EventFacade.class); // private static final Logger logger = LoggerFactory.getLogger(EventFacade.class);
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@PersistenceUnit
private EntityManagerFactory emf;
public EventFacade() { public EventFacade() {
super(LanEvent.class); super(LanEvent.class);
...@@ -36,14 +28,14 @@ public class EventFacade extends GenericFacade<Integer, LanEvent> { ...@@ -36,14 +28,14 @@ public class EventFacade extends GenericFacade<Integer, LanEvent> {
public LanEvent findByHostname(String hostname) { public LanEvent findByHostname(String hostname) {
TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByReferer", LanEvent.class); TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByReferer", LanEvent.class);
q.setParameter("referer", hostname); q.setParameter("referer", hostname);
return this.getSingleNullableResult(q); return getSingleNullableResult(q);
} }
public LanEvent findByName(String name) { public LanEvent findByName(String name) {
TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByName", LanEvent.class); TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByName", LanEvent.class);
q.setParameter("name", name); q.setParameter("name", name);
return this.getSingleNullableResult(q); return getSingleNullableResult(q);
} }
......
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
...@@ -9,9 +7,6 @@ import javax.persistence.EntityManager; ...@@ -9,9 +7,6 @@ import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
@Stateless @Stateless
...@@ -39,7 +34,7 @@ public class EventMapFacade extends EventChildGenericFacade<EventMap> { ...@@ -39,7 +34,7 @@ public class EventMapFacade extends EventChildGenericFacade<EventMap> {
public EventMap findByName(String name) { public EventMap findByName(String name) {
TypedQuery<EventMap> q = em.createNamedQuery("EventMap.findByName", EventMap.class); TypedQuery<EventMap> q = em.createNamedQuery("EventMap.findByName", EventMap.class);
q.setParameter("name", name); q.setParameter("name", name);
return this.getSingleNullableResult(q); return getSingleNullableResult(q);
} }
} }
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import fi.insomnia.bortal.enums.EventStatusEnum;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import fi.insomnia.bortal.enums.EventStatusEnum;
import fi.insomnia.bortal.model.EventStatus; import fi.insomnia.bortal.model.EventStatus;
import javax.persistence.NoResultException;
import javax.persistence.Query;
@Stateless @Stateless
@LocalBean @LocalBean
...@@ -29,7 +27,7 @@ public class EventStatusFacade extends GenericFacade<Integer, EventStatus> { ...@@ -29,7 +27,7 @@ public class EventStatusFacade extends GenericFacade<Integer, EventStatus> {
public EventStatus findEventStatus(EventStatusEnum eventStatusEnum) { public EventStatus findEventStatus(EventStatusEnum eventStatusEnum) {
TypedQuery<EventStatus> q = em.createNamedQuery("EventStatus.findByStatusName", EventStatus.class); TypedQuery<EventStatus> q = em.createNamedQuery("EventStatus.findByStatusName", EventStatus.class);
q.setParameter("name", eventStatusEnum.name()); q.setParameter("name", eventStatusEnum.name());
return this.getSingleNullableResult(q); return getSingleNullableResult(q);
} }
} }
...@@ -12,32 +12,31 @@ import org.slf4j.Logger; ...@@ -12,32 +12,31 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.ModelInterface; import fi.insomnia.bortal.model.ModelInterface;
import fi.insomnia.bortal.model.User;
/** /**
* Session Bean implementation class GenericFacade * Session Bean implementation class GenericFacade
*/ */
public abstract class GenericFacade<PK,T extends ModelInterface>{ public abstract class GenericFacade<PK, T extends ModelInterface> {
private static final Logger logger =LoggerFactory.getLogger(GenericFacade.class); private static final Logger logger = LoggerFactory.getLogger(GenericFacade.class);
private Class<T> entClass; private Class<T> entClass;
public GenericFacade(Class<T>entityClass)
{ public GenericFacade(Class<T> entityClass) {
this.entClass = entityClass; this.entClass = entityClass;
} }
protected Class<T> getEntityClass()
{ protected Class<T> getEntityClass() {
return entClass; return entClass;
} }
protected abstract EntityManager getEm(); protected abstract EntityManager getEm();
public void create(T entity) { public void create(T entity) {
getEm().persist(entity); getEm().persist(entity);
} }
public void remove(T entity) { public void remove(T entity) {
getEm().remove(entity); getEm().remove(entity);
} }
...@@ -47,7 +46,7 @@ public abstract class GenericFacade<PK,T extends ModelInterface>{ ...@@ -47,7 +46,7 @@ public abstract class GenericFacade<PK,T extends ModelInterface>{
} }
public T find(PK id) { public T find(PK id) {
logger.debug("GenericFacade Find class {} By pk {}", new Object[]{getEntityClass(), id}); logger.debug("GenericFacade Find class {} By pk {}", new Object[] { getEntityClass(), id });
T ret = getEm().find(getEntityClass(), id); T ret = getEm().find(getEntityClass(), id);
return ret; return ret;
} }
...@@ -75,9 +74,8 @@ public abstract class GenericFacade<PK,T extends ModelInterface>{ ...@@ -75,9 +74,8 @@ public abstract class GenericFacade<PK,T extends ModelInterface>{
return q.getSingleResult(); return q.getSingleResult();
} }
protected static <K> K getSingleNullableResult(TypedQuery<K> q) {
protected T getSingleNullableResult(TypedQuery<T> q) { K ret = null;
T ret = null;
try { try {
ret = q.getSingleResult(); ret = q.getSingleResult();
} catch (NoResultException e) { } catch (NoResultException e) {
...@@ -85,4 +83,10 @@ public abstract class GenericFacade<PK,T extends ModelInterface>{ ...@@ -85,4 +83,10 @@ public abstract class GenericFacade<PK,T extends ModelInterface>{
} }
return ret; return ret;
} }
public void evict(T entity) {
if (entity != null && entity.getId() != null) {
getEm().getEntityManagerFactory().getCache().evict(getEntityClass(), entity.getId());
}
}
} }
...@@ -30,7 +30,7 @@ public class LogEntryTypeFacade extends GenericFacade<Integer, LogEntryType> { ...@@ -30,7 +30,7 @@ public class LogEntryTypeFacade extends GenericFacade<Integer, LogEntryType> {
TypedQuery<LogEntryType> q = em.createNamedQuery("LogEntryType.findByName", LogEntryType.class); TypedQuery<LogEntryType> q = em.createNamedQuery("LogEntryType.findByName", LogEntryType.class);
q.setParameter("name", type.name()); q.setParameter("name", type.name());
LogEntryType logEntryType = this.getSingleNullableResult(q); LogEntryType logEntryType = getSingleNullableResult(q);
// Might not exist yet // Might not exist yet
if (logEntryType == null) { if (logEntryType == null) {
......
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
...@@ -35,7 +34,7 @@ public class RoleFacade extends EventChildGenericFacade<Role> { ...@@ -35,7 +34,7 @@ public class RoleFacade extends EventChildGenericFacade<Role> {
TypedQuery<Role> q = em.createNamedQuery("Role.findByRoleName", Role.class); TypedQuery<Role> q = em.createNamedQuery("Role.findByRoleName", Role.class);
q.setParameter("name", name); q.setParameter("name", name);
q.setParameter("event", event); q.setParameter("event", event);
return this.getSingleNullableResult(q); return getSingleNullableResult(q);
} }
public List<Role> findForUser(User user, LanEvent event) { public List<Role> findForUser(User user, LanEvent event) {
......
...@@ -35,7 +35,7 @@ public class RoleRightFacade extends EventChildGenericFacade<RoleRight> { ...@@ -35,7 +35,7 @@ public class RoleRightFacade extends EventChildGenericFacade<RoleRight> {
TypedQuery<RoleRight> q = this.getEm().createNamedQuery("RoleRight.findByRightAndRole", RoleRight.class); TypedQuery<RoleRight> q = this.getEm().createNamedQuery("RoleRight.findByRightAndRole", RoleRight.class);
q.setParameter("permission", permission); q.setParameter("permission", permission);
q.setParameter("role", role); q.setParameter("role", role);
return this.getSingleNullableResult(q); return getSingleNullableResult(q);
} }
public List<RoleRight> find(Collection<Role> roles, Permission permission) { public List<RoleRight> find(Collection<Role> roles, Permission permission) {
......
...@@ -29,4 +29,6 @@ public class UserFacade extends GenericFacade<Integer, User> { ...@@ -29,4 +29,6 @@ public class UserFacade extends GenericFacade<Integer, User> {
return getSingleNullableResult(q); return getSingleNullableResult(q);
} }
} }
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
...@@ -13,6 +14,8 @@ public class UserImageFacade extends GenericFacade<Integer, UserImage> { ...@@ -13,6 +14,8 @@ public class UserImageFacade extends GenericFacade<Integer, UserImage> {
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@EJB
private UserFacade userfacade;
public UserImageFacade() { public UserImageFacade() {
super(UserImage.class); super(UserImage.class);
} }
...@@ -20,5 +23,12 @@ public class UserImageFacade extends GenericFacade<Integer, UserImage> { ...@@ -20,5 +23,12 @@ public class UserImageFacade extends GenericFacade<Integer, UserImage> {
protected EntityManager getEm() { protected EntityManager getEm() {
return em; return em;
} }
@Override
public void create(UserImage entity)
{
super.create(entity);
userfacade.evict(entity.getUser());
}
} }
...@@ -13,4 +13,6 @@ public interface EventBeanLocal { ...@@ -13,4 +13,6 @@ public interface EventBeanLocal {
LanEvent mergeChanges(LanEvent event); LanEvent mergeChanges(LanEvent event);
void create(LanEvent event);
} }
...@@ -7,6 +7,7 @@ import javax.ejb.Local; ...@@ -7,6 +7,7 @@ import javax.ejb.Local;
import fi.insomnia.bortal.enums.Permission; import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
@Local @Local
...@@ -37,6 +38,10 @@ public interface UserBeanLocal { ...@@ -37,6 +38,10 @@ public interface UserBeanLocal {
void fatalNotLoggedIn(); void fatalNotLoggedIn();
UserImage uploadImage(Integer userid, String contentType, byte[] image, String filename, String description);
UserImage findUserImage(int id);
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
*/ */
package fi.insomnia.bortal.enums; package fi.insomnia.bortal.enums;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* *
* @author tuukka * @author tuukka
...@@ -21,9 +24,13 @@ public enum Permission { ...@@ -21,9 +24,13 @@ public enum Permission {
; ;
private String description; private String description;
private static final Logger logger = LoggerFactory.getLogger(Permission.class);
public static Permission getPermission(String name) { public static Permission getPermission(String name) {
if (name == null || name.isEmpty()) if (name == null || name.isEmpty())
{
logger.warn("Trying to get permission for empty name {}" , name);
return null; return null;
}
try { try {
return valueOf(name); return valueOf(name);
} catch (IllegalArgumentException x) { } catch (IllegalArgumentException x) {
......
...@@ -108,6 +108,7 @@ public class Bill implements EventChildInterface { ...@@ -108,6 +108,7 @@ public class Bill implements EventChildInterface {
/** /**
* Bill may have multiple items on multiple rows. * Bill may have multiple items on multiple rows.
*/ */
@OneToMany(mappedBy = "bill") @OneToMany(mappedBy = "bill")
private List<BillLine> billLines; private List<BillLine> billLines;
...@@ -124,7 +125,6 @@ public class Bill implements EventChildInterface { ...@@ -124,7 +125,6 @@ public class Bill implements EventChildInterface {
/** /**
* User who should pay this bill. * User who should pay this bill.
*/ */
@JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
@ManyToOne(optional = false) @ManyToOne(optional = false)
private User user; private User user;
......
...@@ -15,7 +15,6 @@ import javax.persistence.CascadeType; ...@@ -15,7 +15,6 @@ import javax.persistence.CascadeType;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.EmbeddedId; import javax.persistence.EmbeddedId;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.Lob; import javax.persistence.Lob;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
......
...@@ -19,6 +19,7 @@ import javax.persistence.ManyToMany; ...@@ -19,6 +19,7 @@ import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries; import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Temporal; import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
...@@ -111,6 +112,9 @@ public class User implements ModelInterface { ...@@ -111,6 +112,9 @@ public class User implements ModelInterface {
@Column(name = "phone") @Column(name = "phone")
private String phone; private String phone;
@OneToOne()
private UserImage currentImage;
@Convert("gender") @Convert("gender")
@Column(name = "gender", nullable = false) @Column(name = "gender", nullable = false)
private Gender gender = Gender.UNDEFINED; private Gender gender = Gender.UNDEFINED;
...@@ -137,7 +141,7 @@ public class User implements ModelInterface { ...@@ -137,7 +141,7 @@ public class User implements ModelInterface {
@OneToMany(mappedBy = "user") @OneToMany(mappedBy = "user")
private List<LogEntry> logEntryList; private List<LogEntry> logEntryList;
@OneToMany(mappedBy = "user") @OneToMany(mappedBy = "user",fetch=FetchType.LAZY)
private List<UserImage> userImageList; private List<UserImage> userImageList;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user") @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
...@@ -560,4 +564,12 @@ public class User implements ModelInterface { ...@@ -560,4 +564,12 @@ public class User implements ModelInterface {
public Gender getGender() { public Gender getGender() {
return gender; return gender;
} }
public void setCurrentImage(UserImage currentImage) {
this.currentImage = currentImage;
}
public UserImage getCurrentImage() {
return currentImage;
}
} }
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
*/ */
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
import java.util.Calendar;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
...@@ -12,9 +14,10 @@ import javax.persistence.Id; ...@@ -12,9 +14,10 @@ import javax.persistence.Id;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.Lob; import javax.persistence.Lob;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries; import javax.persistence.OneToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version; import javax.persistence.Version;
/** /**
...@@ -22,12 +25,12 @@ import javax.persistence.Version; ...@@ -22,12 +25,12 @@ import javax.persistence.Version;
*/ */
@Entity @Entity
@Table(name = "user_images") @Table(name = "user_images")
@NamedQueries( { //@NamedQueries({
@NamedQuery(name = "UserImage.findAll", query = "SELECT u FROM UserImage u"), // @NamedQuery(name = "UserImage.findAll", query = "SELECT u FROM UserImage u"),
//
@NamedQuery(name = "UserImage.findByName", query = "SELECT u FROM UserImage u WHERE u.name = :name"), // @NamedQuery(name = "UserImage.findByName", query = "SELECT u FROM UserImage u WHERE u.name = :name"),
@NamedQuery(name = "UserImage.findByDescription", query = "SELECT u FROM UserImage u WHERE u.description = :description"), // @NamedQuery(name = "UserImage.findByDescription", query = "SELECT u FROM UserImage u WHERE u.description = :description"),
@NamedQuery(name = "UserImage.findByMimeType", query = "SELECT u FROM UserImage u WHERE u.mimeType = :mimeType") }) // @NamedQuery(name = "UserImage.findByMimeType", query = "SELECT u FROM UserImage u WHERE u.mimeType = :mimeType") })
public class UserImage implements ModelInterface { public class UserImage implements ModelInterface {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -37,6 +40,10 @@ public class UserImage implements ModelInterface { ...@@ -37,6 +40,10 @@ public class UserImage implements ModelInterface {
@Column(name = "user_image_id", nullable = false) @Column(name = "user_image_id", nullable = false)
private Integer id; private Integer id;
@Column(name="uploaded",nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar uploaded = Calendar.getInstance();
@Column(name = "name") @Column(name = "name")
private String name; private String name;
...@@ -55,6 +62,9 @@ public class UserImage implements ModelInterface { ...@@ -55,6 +62,9 @@ public class UserImage implements ModelInterface {
@ManyToOne @ManyToOne
private User user; private User user;
@OneToOne(mappedBy = "currentImage")
private User defaultImage;
@Version @Version
@Column(nullable = false) @Column(nullable = false)
private int jpaVersionField = 0; private int jpaVersionField = 0;
...@@ -173,4 +183,20 @@ public class UserImage implements ModelInterface { ...@@ -173,4 +183,20 @@ public class UserImage implements ModelInterface {
public void setUser(User user) { public void setUser(User user) {
this.user = user; this.user = user;
} }
public void setDefaultImage(User defaultImage) {
this.defaultImage = defaultImage;
}
public User getDefaultImage() {
return defaultImage;
}
public void setUploaded(Calendar uploaded) {
this.uploaded = uploaded;
}
public Calendar getUploaded() {
return uploaded;
}
} }
#Fri Aug 27 04:19:39 EEST 2010
XDOCLETBUILDERACTIVE=true
XDOCLETHOME=
XDOCLETUSEGLOBAL=true
XDOCLETVERSION=1.2.1
eclipse.preferences.version=1
...@@ -26,6 +26,14 @@ ...@@ -26,6 +26,14 @@
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet> </servlet>
<servlet> <servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>PlaceMap</servlet-name> <servlet-name>PlaceMap</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceMap</servlet-class> <servlet-class>fi.insomnia.bortal.servlet.PlaceMap</servlet-class>
</servlet> </servlet>
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.bill.list" /> <ui:param name="thispage" value="page.bill.list" />
<ui:define name="content"> <ui:define name="content">
<bills:list /> <bills:list billview="#{billView}"/>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -26,6 +26,12 @@ ...@@ -26,6 +26,12 @@
<h:commandButton id="commitbtn" action="#{eventorgView.save()}" value="#{i18n['eventorg.save']}" /> <h:commandButton id="commitbtn" action="#{eventorgView.save()}" value="#{i18n['eventorg.save']}" />
</h:panelGrid> </h:panelGrid>
</h:form> </h:form>
<h2>#{i18n['eventorg.createevent']}</h2>
<h:form id="createevent" >
<h:outputLabel for="createEventName" value="#{i18n['event.name']}" />
<h:inputText id="createEventName" value="#{eventorgView.eventname}" />
<h:commandButton action="#{eventorgView.createEvent()}" value="#{i18n['eventorg.createEvent']}" />
</h:form>
<h2>#{i18n['eventorg.events']}</h2> <h2>#{i18n['eventorg.events']}</h2>
<h:form id="orgsEventlist"> <h:form id="orgsEventlist">
<h:dataTable border="1" id="org" value="#{eventorgView.orgsEvents}" var="event"> <h:dataTable border="1" id="org" value="#{eventorgView.orgsEvents}" var="event">
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
<li><h:link outcome="/role/create" value="#{i18n['sidebar.role.create']}"/></li> <li><h:link outcome="/role/create" value="#{i18n['sidebar.role.create']}"/></li>
<li><h:link outcome="/role/list" value="#{i18n['sidebar.role.list']}"/></li> <li><h:link outcome="/role/list" value="#{i18n['sidebar.role.list']}"/></li>
<li><h:link outcome="/role/create" value="#{i18n['sidebar.role.create']}"/></li> <li><h:link outcome="/role/create" value="#{i18n['sidebar.role.create']}"/></li>
<li><h:link outcome="/eventorg/list" value="#{i18n['sidebar.eventorg.list']}"/></li>
<li><h:link outcome="/eventorg/list" value="#{i18n['sidebar.eventorg.list']}"/></li>
</ul> </ul>
</ui:define> </ui:define>
......
...@@ -12,12 +12,13 @@ ...@@ -12,12 +12,13 @@
<composite:interface> <composite:interface>
<composite:attribute name="billview" required="true" />
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h:form> <h:form>
<h:dataTable border="1" id="billList" value="#{billView.usersBills}" var="bill"> <h:dataTable border="1" id="billList" value="#{cc.attrs.billview.bills}" var="bill">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['bill.sentDate']}" /> <h:outputText value="${i18n['bill.sentDate']}" />
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
<composite:interface> <composite:interface>
<composite:attribute name="items" required="true" /> <composite:attribute name="items" required="true" />
<composite:attribute name="commitValue" required="true" /> <composite:attribute name="commitValue" required="true" />
<composite:attribute name="outcome" required="false" />
<composite:attribute name="commitaction" method-signature="java.lang.String action()" required="true" /> <composite:attribute name="commitaction" method-signature="java.lang.String action()" required="true" />
</composite:interface> </composite:interface>
......
...@@ -12,13 +12,12 @@ ...@@ -12,13 +12,12 @@
<composite:interface> <composite:interface>
<composite:attribute name="valuelist" required="true" />
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h:form id="rolelist"> <h:form id="rolelist">
<h:dataTable border="1" id="user" value="#{cc.attrs.valuelist}" var="role"> <h:dataTable border="1" id="user" value="#{roleView.roles}" var="role">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="#" /> <h:outputText value="#" />
......
...@@ -12,32 +12,40 @@ ...@@ -12,32 +12,40 @@
<composite:interface> <composite:interface>
<composite:attribute name="user" required="true" />
<composite:attribute name="commitvalue" required="true" /> <composite:attribute name="commitvalue" required="true" />
<composite:attribute name="commitaction" required="true" method-signature="java.lang.String action()" /> <composite:attribute name="commitaction" required="true" method-signature="java.lang.String action()" />
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h:form id="userform"> <h:form id="userform">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel value="#{i18n['user.login']}:" for="login"/><h:inputText id="login" value="#{cc.attrs.user.login}" /> <h:outputLabel value="#{i18n['user.login']}:" for="login"/><h:inputText id="login" value="#{userView.user.login}" />
<h:outputLabel value="#{i18n['user.nick']}:" for="nick" /><h:inputText id="nick" value="#{cc.attrs.user.nick}" /> <h:outputLabel value="#{i18n['user.nick']}:" for="nick" /><h:inputText id="nick" value="#{userView.user.nick}" />
<h:outputLabel value="#{i18n['user.email']}:" for="email"/><h:inputText id="email" value="#{cc.attrs.user.email}" /> <h:outputLabel value="#{i18n['user.email']}:" for="email"/><h:inputText id="email" value="#{userView.user.email}" />
<h:outputLabel value="#{i18n['user.firstNames']}:" for="firstnames" /><h:inputText id="firstnames" value="#{cc.attrs.user.firstnames}" /> <h:outputLabel value="#{i18n['user.firstNames']}:" for="firstnames" /><h:inputText id="firstnames" value="#{userView.user.firstnames}" />
<h:outputLabel value="#{i18n['user.lastName']}:" for="lastname" /><h:inputText id="lastname" value="#{cc.attrs.user.lastname}" /> <h:outputLabel value="#{i18n['user.lastName']}:" for="lastname" /><h:inputText id="lastname" value="#{userView.user.lastname}" />
<h:outputLabel value="#{i18n['user.address']}:" for="address" /><h:inputText id="address" value="#{cc.attrs.user.address}" /> <h:outputLabel value="#{i18n['user.address']}:" for="address" /><h:inputText id="address" value="#{userView.user.address}" />
<h:outputLabel value="#{i18n['user.zipCode']}:" for="zip" /><h:inputText id="zip" value="#{cc.attrs.user.zip}" /> <h:outputLabel value="#{i18n['user.zipCode']}:" for="zip" /><h:inputText id="zip" value="#{userView.user.zip}" />
<h:outputLabel value="#{i18n['user.town']}:" for="town"/><h:inputText id="town" value="#{cc.attrs.user.town}" /> <h:outputLabel value="#{i18n['user.town']}:" for="town"/><h:inputText id="town" value="#{userView.user.town}" />
<h:outputLabel rendered="#{sessionHandler.superadmin}" value="#{i18n['user.superadmin']}:" for="superadmin" /> <h:outputLabel rendered="#{sessionHandler.superadmin}" value="#{i18n['user.superadmin']}:" for="superadmin" />
<h:selectBooleanCheckbox rendered="#{sessionHandler.superadmin}" id="superadmin" value="#{cc.attrs.user.superadmin}" /> <h:selectBooleanCheckbox rendered="#{sessionHandler.superadmin}" id="superadmin" value="#{userView.user.superadmin}" />
<h:outputLabel value="#{i18n['user.superadmin']}:" for="currentImage" />
<h:selectOneMenu id="currentImage" value="#{userView.user.currentImage}" converter="#{userimageConverter}" >
<f:selectItems var="image" itemLabel="#{image.description}" value="#{userView.user.userImageList}" />
</h:selectOneMenu>
<h:outputLabel value="#{i18n['user.sex']}:" for="sex"/> <h:outputLabel value="#{i18n['user.sex']}:" for="sex"/>
<h:selectOneRadio id="sex" value="#{cc.attrs.user.gender}"> <h:selectOneRadio id="sex" value="#{userView.user.gender}">
<f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" /> <f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" />
<f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" /> <f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" /> <f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
</h:selectOneRadio> </h:selectOneRadio>
<h:selectManyCheckbox converter="#{sessionHandler.roleConverter}" rendered="#{sessionHandler.hasPermission('ROLE_MANAGEMENT', 'READ')}" disabled="#{!sessionHandler.hasPermission('ROLE_MANAGEMENT', 'WRITE')}" layout="pageDirection" id="roles" value="#{cc.attrs.user.roles}"> <h:outputLabel value="#{i18n['user.roles']}:" for="roles"/>
<h:selectManyCheckbox converter="#{sessionHandler.roleConverter}" rendered="#{sessionHandler.hasPermission('ROLE_MANAGEMENT', 'READ')}" disabled="#{!sessionHandler.hasPermission('ROLE_MANAGEMENT', 'WRITE')}" layout="pageDirection" id="roles" value="#{userView.user.roles}">
<f:selectItems var="roleitem" itemLabel="#{roleitem.name}" value="#{userView.userRoles}" /> <f:selectItems var="roleitem" itemLabel="#{roleitem.name}" value="#{userView.userRoles}" />
</h:selectManyCheckbox> </h:selectManyCheckbox>
...@@ -45,6 +53,31 @@ ...@@ -45,6 +53,31 @@
</h:panelGrid> </h:panelGrid>
</h:form> </h:form>
<h2>#{i18n['user.uploadimage']}</h2>
<form onsubmit="window.open('', 'imagesubmitpopup', 'height=200,width=400'); this.target='imagesubmitpopup'; return true; " action="#{request.contextPath}/UploadServlet" enctype="multipart/form-data" method="post">
<input type="hidden" name="userid" value="#{userView.user.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['imagefile.file']}" /><input type="file" name="imagefile" />
<h:outputLabel value="#{i18n['imagefile.description']}"/><input type="text" name="description" />
<h:panelGroup><input type="submit" name="submit" value="#{i18n['user.imagesubmit']}" /></h:panelGroup>
</h:panelGrid>
</form>
<h2>#{i18n['user.imagelist']}</h2>
<h:form id="imagelist">
<h:dataTable value="#{userView.user.userImageList}" id="imagelist" var="image">
<h:column>
<h:outputText value="#{image.name}" />
</h:column>
<h:column>
<h:outputText value="#{image.description}" />
</h:column>
</h:dataTable>
</h:form>
</composite:implementation> </composite:implementation>
</html> </html>
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
</composite:interface>
<composite:implementation>
<tools:fatalPermission target="USER_MANAGEMENT" permission="READ" />
<h:form id="userlistform">
<h:dataTable border="1" id="user" value="#{userView.users}" var="user">
<h:column>
<f:facet name="header">
<h:outputText value="Id" />
</f:facet>
<h:outputText value="#{user.id}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['user.nick']}" />
</f:facet>
<h:outputText value="#{user.nick}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['user.firstnames']}" />
</f:facet>
<h:outputText value="#{user.firstnames}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['user.lastname']}" />
</f:facet>
<h:outputText value="#{user.lastname}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['user.email']}" />
</f:facet>
<h:outputText value="#{user.email}" />
</h:column>
<h:column>
<h:commandButton action="#{userView.edit()}" value="#{i18n['user.edit']}" />
</h:column>
</h:dataTable>
</h:form>
</composite:implementation>
</html>
...@@ -13,8 +13,7 @@ ...@@ -13,8 +13,7 @@
<ui:param name="thispage" value="page.role.list" /> <ui:param name="thispage" value="page.role.list" />
<ui:define name="content"> <ui:define name="content">
<tools:fatalPermission target="ROLE_MANAGEMENT" permission="READ" /> <tools:fatalPermission target="ROLE_MANAGEMENT" permission="READ" />
<role:list valuelist="#{roleView.roles}" > <role:list />
</role:list>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -11,9 +11,7 @@ ...@@ -11,9 +11,7 @@
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.user.create" /> <ui:param name="thispage" value="page.user.create" />
<ui:define name="content"> <ui:define name="content">
<users:edit commitaction="#{userView.saveUser()}" user="#{userView.user}" commitvalue="#{i18n['user.save']}"/> <users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}"/>
<users:editroles />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -11,10 +11,9 @@ ...@@ -11,10 +11,9 @@
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.user.editself" /> <ui:param name="thispage" value="page.user.editself" />
<ui:define name="content"> <ui:define name="content">
#{userView.editSelf()}
<users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}" />
<users:edit commitaction="#{userView.saveUser()}" user="#{userView.self}" commitvalue="#{i18n['user.save']}" />
<users:editroles rendered="#{sessionhandler.hasPermission('ROLE_MANAGEMENT', 'READ')}"/>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -57,13 +57,21 @@ public class SessionHandler { ...@@ -57,13 +57,21 @@ public class SessionHandler {
} }
public boolean hasPermission(String target, String permission) { public boolean hasPermission(String target, String permission) {
RolePermission perm = null; RolePermission perm = RolePermission.valueOf(permission.toUpperCase());
if (permission.equalsIgnoreCase("read")) { // RolePermission perm = null;
perm = RolePermission.READ; // if (permission.equalsIgnoreCase("read")) {
} else if (permission.equals("write")) { // perm = RolePermission.READ;
perm = RolePermission.WRITE; // } else if (permission.equals("write")) {
} else if (permission.equals("execute")) { // perm = RolePermission.WRITE;
perm = RolePermission.EXECUTE; // } else if (permission.equals("execute")) {
// perm = RolePermission.EXECUTE;
// }else {
// throw new RuntimeException("permission " + permission + " does not match any")
// }
if(perm == null)
{
logger.warn("Permission {} does not have matching value in RolePermission enum!");
throw new RuntimeException("Matching role permission could not be found!");
} }
return hasPermission(target, perm); return hasPermission(target, perm);
...@@ -87,6 +95,7 @@ public class SessionHandler { ...@@ -87,6 +95,7 @@ public class SessionHandler {
public boolean hasPermission(Permission target, RolePermission permission) { public boolean hasPermission(Permission target, RolePermission permission) {
if (target == null || permission == null) { if (target == null || permission == null) {
logger.warn("Target {} or permission {} is null", target, permission);
throw new RuntimeException("Empty target or permission!"); throw new RuntimeException("Empty target or permission!");
} }
boolean ret = userbean.hasPermission(target, permission); boolean ret = userbean.hasPermission(target, permission);
......
package fi.insomnia.bortal.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.model.UserImage;
/**
* Servlet implementation class UploadServlet
*/
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UploadServlet() {
super();
// TODO Auto-generated constructor stub
}
private static final Logger logger = LoggerFactory.getLogger(UploadServlet.class);
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@EJB
private UserBeanLocal userbean;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// String rawResourcePath = request.getPathInfo();
// logger.info("respath2 : {}", rawResourcePath);
// String[] paths = rawResourcePath.trim().split("/");
// logger.info("paths length: {}", paths.length);
//
// if (paths.length != 2 || paths[1].trim().isEmpty()) {
// return;
// }
// Integer userId = Integer.parseInt(paths[1].trim());
// logger.info("Uploadinfg for user {}", userId);
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
try {
String contenttype = "";
byte[] imagedata = null;
int userId = 0;
String description = "";
String filename = "";
for (Object ti : upload.parseRequest(request)) {
if (ti instanceof FileItem) {
FileItem fi = (FileItem) ti;
if (fi.getFieldName().equals("userid")) {
userId = Integer.parseInt(fi.getString());
} else if (fi.getFieldName().equals("description")) {
description = fi.getString();
} else if (fi.getFieldName().equals("imagefile")) {
imagedata = fi.get();
filename = fi.getName();
contenttype = fi.getContentType();
}
}
}
UserImage userimage = userbean.uploadImage(userId, contenttype, imagedata, filename, description);
} catch (FileUploadException e) {
logger.warn("Error uploading image", e);
}
PrintWriter writer = response.getWriter();
writer.append("File upload successfull");
}
}
...@@ -27,7 +27,7 @@ public class BillView { ...@@ -27,7 +27,7 @@ public class BillView {
private ListDataModel<Bill> billList; private ListDataModel<Bill> billList;
public ListDataModel<Bill> getUsersBills() public ListDataModel<Bill> getBills()
{ {
userbean.fatalNotLoggedIn(); userbean.fatalNotLoggedIn();
List<Bill> bills = userbean.getCurrentUser().getBills(); List<Bill> bills = userbean.getCurrentUser().getBills();
......
...@@ -47,6 +47,7 @@ public class EventOrganiserView { ...@@ -47,6 +47,7 @@ public class EventOrganiserView {
private EventOrganiser eventorg; private EventOrganiser eventorg;
private String createorgname; private String createorgname;
private LanEvent event; private LanEvent event;
private String eventname;
public DataModel<EventOrganiser> getOrganisations() { public DataModel<EventOrganiser> getOrganisations() {
userbean.fatalNotLoggedIn(); userbean.fatalNotLoggedIn();
...@@ -71,6 +72,15 @@ public class EventOrganiserView { ...@@ -71,6 +72,15 @@ public class EventOrganiserView {
setEvent(orgsEvents.getRowData()); setEvent(orgsEvents.getRowData());
return "editEvent"; return "editEvent";
} }
public String createEvent()
{
event = new LanEvent();
event.setOrganiser(eventorg);
event.setName(eventname);
eventbean.create(event);
eventname = "";
return "editEvent";
}
public String edit() { public String edit() {
eventorg = null; eventorg = null;
...@@ -142,4 +152,12 @@ public class EventOrganiserView { ...@@ -142,4 +152,12 @@ public class EventOrganiserView {
{ {
return new RoleConverter(rolebean, event); return new RoleConverter(rolebean, event);
} }
public void setEventname(String eventname) {
this.eventname = eventname;
}
public String getEventname() {
return eventname;
}
} }
...@@ -56,6 +56,7 @@ public class ProductShopView { ...@@ -56,6 +56,7 @@ public class ProductShopView {
logger.debug("Committing billCart"); logger.debug("Committing billCart");
Iterator<ProductShopItem> cartIter = billCart.iterator(); Iterator<ProductShopItem> cartIter = billCart.iterator();
Bill bill = null; Bill bill = null;
bill = billBean.createEmptyBill(getShoppingUser()); bill = billBean.createEmptyBill(getShoppingUser());
...@@ -70,6 +71,7 @@ public class ProductShopView { ...@@ -70,6 +71,7 @@ public class ProductShopView {
} }
public DataModel<ProductShopItem> getBillCart() { public DataModel<ProductShopItem> getBillCart() {
logger.debug("Creating new BillCart");
userBean.fatalPermission(Permission.TICKET_SALES, RolePermission.EXECUTE); userBean.fatalPermission(Permission.TICKET_SALES, RolePermission.EXECUTE);
billCart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts())); billCart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts()));
......
...@@ -63,7 +63,6 @@ public class RoleView { ...@@ -63,7 +63,6 @@ public class RoleView {
public DataModel<Role> getRoles() { public DataModel<Role> getRoles() {
items = new ListDataModel<Role>(getRoleList()); items = new ListDataModel<Role>(getRoleList());
logger.info("Fetching roles. Found {}", items.getRowCount());
return items; return items;
} }
......
...@@ -58,10 +58,9 @@ public class UserView { ...@@ -58,10 +58,9 @@ public class UserView {
} }
public User getSelf() { public void editSelf() {
userBean.fatalNotLoggedIn(); userBean.fatalNotLoggedIn();
setUser(userBean.getCurrentUser()); setUser(userBean.getCurrentUser());
return user;
} }
public String createUser() { public String createUser() {
...@@ -88,6 +87,7 @@ public class UserView { ...@@ -88,6 +87,7 @@ public class UserView {
} }
public String saveUser() { public String saveUser() {
logger.debug("Saving user at UserView mbean nick: {}", user.getNick());
User thisusr = getUser(); User thisusr = getUser();
if (!userBean.isCurrentUser(thisusr)) { if (!userBean.isCurrentUser(thisusr)) {
logger.debug("user {} is modifying user {}",userBean.getCurrentUser(), thisusr); logger.debug("user {} is modifying user {}",userBean.getCurrentUser(), thisusr);
...@@ -95,7 +95,7 @@ public class UserView { ...@@ -95,7 +95,7 @@ public class UserView {
} }
setUser(userBean.mergeChanges(getUser())); setUser(userBean.mergeChanges(getUser()));
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(I18n.get("user.successfullySaved"))); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(I18n.get("user.successfullySaved")));
return ""; return "edit";
} }
public ListDataModel<User> getUsers() { public ListDataModel<User> getUsers() {
...@@ -105,7 +105,7 @@ public class UserView { ...@@ -105,7 +105,7 @@ public class UserView {
users = userBean.getUsers(); users = userBean.getUsers();
items = new ListDataModel<User>(users); items = new ListDataModel<User>(users);
logger.info("Fetching users. Found {}", items.getRowCount()); logger.debug("Fetching users. Found {}", items.getRowCount());
return items; return items;
......
...@@ -3,13 +3,11 @@ package fi.insomnia.bortal.view.flash; ...@@ -3,13 +3,11 @@ package fi.insomnia.bortal.view.flash;
import javax.inject.Named; import javax.inject.Named;
import org.granite.messaging.service.annotations.RemoteDestination; import org.granite.messaging.service.annotations.RemoteDestination;
import org.granite.tide.cdi.TideComponent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@RemoteDestination @RemoteDestination
@Named("hvTest") @Named("hvTest")
@TideComponent()
public class HvTest { public class HvTest {
private static final Logger logger = LoggerFactory.getLogger(HvTest.class); private static final Logger logger = LoggerFactory.getLogger(HvTest.class);
......
package fi.insomnia.bortal.web.converter;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.NoneScoped;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.RoleBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.UserImage;
@ManagedBean(name="userimageConverter")
@NoneScoped()
public class UserImageConverter implements Converter {
@EJB
private UserBeanLocal userbean;
private static final Logger logger = LoggerFactory.getLogger(UserImageConverter.class);
public UserImageConverter() {
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
logger.debug("converting userimage string {} to Object", value);
if(value == null || value.isEmpty())
{
return null;
}
int id = Integer.parseInt(value);
UserImage ret = userbean.findUserImage(id);
return ret;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
String ret = "";
if (value instanceof UserImage) {
ret = ((UserImage) value).getId().toString();
}
logger.debug("converting userimage {} to string", ret);
return ret;
}
}
...@@ -25,6 +25,7 @@ product.sort=J\u00e4rjestys luku ...@@ -25,6 +25,7 @@ product.sort=J\u00e4rjestys luku
product.unitName=Tuoteyksikk\u00f6 product.unitName=Tuoteyksikk\u00f6
product.vat=ALV product.vat=ALV
product.cart.count=Ostoskoriin product.cart.count=Ostoskoriin
products.save=Tallenna
productshop.commit=Osta productshop.commit=Osta
role.create=Luo rooli role.create=Luo rooli
role.edit=Muokkaa role.edit=Muokkaa
...@@ -53,6 +54,9 @@ user.sex=Sukupuoli ...@@ -53,6 +54,9 @@ user.sex=Sukupuoli
user.superadmin=Superadmin user.superadmin=Superadmin
user.rolesave=Tallenna roolit user.rolesave=Tallenna roolit
bill.billNumber=Laskun numero bill.billNumber=Laskun numero
bill.sentDate=Pivys
bill.totalPrice=Laskun summa
bill.printBill=Tulosta lasku
loginerror.header=Kirjautuminen eponnistui loginerror.header=Kirjautuminen eponnistui
loginerror.message=Kyttjtunnus tai salasana ei ollut oikein. loginerror.message=Kyttjtunnus tai salasana ei ollut oikein.
permissiondenied.alreadyLoggedIn=Sinulla ei ole riittvsti oikeuksia! permissiondenied.alreadyLoggedIn=Sinulla ei ole riittvsti oikeuksia!
...@@ -61,9 +65,32 @@ user.sex.MALE=Mies ...@@ -61,9 +65,32 @@ user.sex.MALE=Mies
user.sex.UNDEFINED=M\u00e4\u00e4rittelem\u00e4tt\u00e4 user.sex.UNDEFINED=M\u00e4\u00e4rittelem\u00e4tt\u00e4
user.username=K\u00e4ytt\u00e4j\u00e4tunnus user.username=K\u00e4ytt\u00e4j\u00e4tunnus
user.validate.notUniqueUsername=K\u00e4ytt\u00e4j\u00e4tunnus on jo olemassa. Ole hyv\u00e4 ja valitse toinen tunnus user.validate.notUniqueUsername=K\u00e4ytt\u00e4j\u00e4tunnus on jo olemassa. Ole hyv\u00e4 ja valitse toinen tunnus
user.successfullySaved=Tiedot tallennettu onnistuneesti
user.roles=Roolit
user.uploadimage=Lhet kuva
user.imagelist=Tallennetut kuvat
imagefile.file=Kuvatiedosto
imagefile.description=Kuvaus
user.imagesubmit=Lhet kuva
permissiondenied.header=Psy kielletty permissiondenied.header=Psy kielletty
permissiondenied.notLoggedIn=Sinulla ei ole riittvsti oikeuksia tlle sivulle. permissiondenied.notLoggedIn=Sinulla ei ole riittvsti oikeuksia tlle sivulle.
viewexpired.title=Nkym on vanhentumut viewexpired.title=Nkym on vanhentumut
viewexpired.body=Ole hyv ja kirjaudu sisn uudelleen. viewexpired.body=Ole hyv ja kirjaudu sisn uudelleen.
eventorg.events=Organisaation tapahtumat eventorg.events=Organisaation tapahtumat
eventorgView.eventname=Tapahtuman nimi
eventorg.createEvent=Luo tapahtuma
sidebar.user.editself=Omat tiedot
sidebar.user.list=Kyttjt
sidebar.user.create=Uusi kyttj
sidebar.bill.list=Omat laskut
sidebar.product.create=Uusi tuote
sidebar.product.list=Tuotteet
sidebar.product.createBill=Luo lasku
sidebar.map.placemap=Paikkakartta
sidebar.role.create=Uusi rooli
sidebar.role.list=Roolit
sidebar.eventorg.list=Omat organisaatiot
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!