Commit b99fa2c8 by Petri Järvisalo

Merge branch 'master' of codecrew.fi:bortal

Conflicts:
	code/LanBortalWeb/WebContent/resources/style/insomnia2/css/tyyli.css
2 parents f1f40b33 5aa5fbb8
Showing with 1344 additions and 603 deletions
......@@ -64,7 +64,7 @@ public class AccountEventBean implements AccountEventBeanLocal {
public void delete(AccountEvent account) {
AccountEvent acco = accountfacade.find(account.getId());
loggingbean.logMessage(SecurityLogType.accountEvent, permbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getLogin(), "'");
loggingbean.logMessage(SecurityLogType.accountEvent, permbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getUser().getLogin(), "'");
acco.getProduct().getAccountEvents().remove(acco);
if (acco.getBill() != null) {
acco.getBill().setAccountEvent(null);
......
......@@ -27,7 +27,6 @@ import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.ProductFlag;
......@@ -88,7 +87,7 @@ public class BillBean implements BillBeanLocal {
return null;
}
Bill bill = billFacade.find(id);
IUser currentuser = permbean.getCurrentUser();
EventUser currentuser = permbean.getCurrentUser();
logger.debug("bill {} user {}", bill, currentuser);
if (bill != null && !currentuser.equals(bill.getUser()) && !permbean.hasPermission(BillPermission.READ_ALL)) {
......@@ -249,7 +248,7 @@ public class BillBean implements BillBeanLocal {
MailMessage msg = new MailMessage();
msg.setSubject(I18n.get("bill.billMarkedPaidMail.subject"));
msg.setMessage(I18n.get("bill.billMarkedPaidMail.message", (bill.getBillNumber() == null) ? "----" : bill.getBillNumber().toString()));
msg.setTo(bill.getUser());
msg.setTo(bill.getUser().getUser());
utilbean.sendMail(msg);
eventUserFacade.flush();
eventUserFacade.evict(bill.getUser());
......
......@@ -154,7 +154,7 @@ public class CardTemplateBean implements CardTemplateBeanLocal {
// user.getPrintedCards().add(pc);
printedcardfacade.create(pc);
biggestCard = pc;
logger.info("User {} has too little power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower });
logger.info("User {} has too little power old role {} New role {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
} else if (existingPower > newPower) {
MailMessage msg = new MailMessage();
LanEventProperty value = eventPropertyFacade.find(eventBean.getCurrentEvent(), LanEventPropertyKey.ADMIN_MAIL);
......@@ -164,13 +164,13 @@ public class CardTemplateBean implements CardTemplateBeanLocal {
msg.setFromAddress(value.getTextvalue());
msg.setFromName("Lippukauppa");
msg.setToAddress(value.getTextvalue());
msg.setSubject("User " + user.getLogin() + " has too powerful card!");
msg.setMessage("User ", user.getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa");
msg.setSubject("User " + user.getUser().getLogin() + " has too powerful card!");
msg.setMessage("User ", user.getUser().getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa");
mailbean.sendMail(msg);
logger.info("User {} has too much power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower });
logger.info("User {} has too much power old role {} New role {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
}
} else {
logger.info("User {} has power {} and roles has power {}", new Object[] { user.getLogin(), existingPower, newPower });
logger.info("User {} has power {} and roles has power {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
}
return biggestCard;
......
......@@ -119,13 +119,15 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
String priceInCents = Integer.valueOf(bill.totalPrice().multiply(TO_CENTS).intValue()).toString();
Map<CheckoutFiParam, String> postParams = new HashMap<CheckoutFiParam, String>();
String returnUrl = new StringBuilder("http://").append(BortalLocalContextHolder.getHostname()).append("/LanBortalWeb/checkout/").toString();
String returnUrl = new StringBuilder(BortalLocalContextHolder.isSsl() ? "https://" : "http://")
.append(BortalLocalContextHolder.getHostname())
.append("/LanBortalWeb/checkout/")
.toString();
StringBuilder stamp = new StringBuilder();
stamp.append(bill.getId());
stamp.append(STAMP_SPLITCHAR);
stamp.append(Calendar.getInstance().getTimeInMillis() / 1000);
logger.info("Created stamp {}", stamp.toString());
stamp.append(bill.getSentDate().getTimeInMillis() / 1000);
postParams.put(CheckoutFiParam.STAMP, stamp.toString());
postParams.put(CheckoutFiParam.AMOUNT, priceInCents);
......@@ -160,7 +162,8 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
try {
final String calculatedHash = PasswordFunctions.calculateMd5(mdString.toString());
logger.info("Calculated checksum {} from {}", mdString.toString(), calculatedHash);
// logger.info("Calculated checksum {} from {}",
// mdString.toString(), calculatedHash);
nameValuePairs.add(new BasicNameValuePair("MAC", calculatedHash));
......@@ -172,7 +175,8 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
StringWriter writer = new StringWriter();
IOUtils.copy(response.getEntity().getContent(), writer, "UTF8");
String xmlReturn = writer.toString();
logger.info("Got response from checkout.fi msg {}, {} ", response.getStatusLine().getStatusCode(), xmlReturn);
// logger.info("Got response from checkout.fi msg {}, {} ",
// response.getStatusLine().getStatusCode(), xmlReturn);
return parseTokenXml(xmlReturn);
......
......@@ -51,34 +51,51 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
EventUser eventUser = eventUserFacade.findByLogin(username.trim());
User user = null;
// Might not have EventUser
if (eventUser == null) {
User user = userfacade.findByLogin(username.trim());
if (user != null) {
eventUser = new EventUser(user, eventbean.getCurrentEvent());
eventUserFacade.merge(eventUser);
}
user = userfacade.findByLogin(username.trim());
} else {
user = eventUser.getUser();
}
EventUser ret = null;
if (eventUser != null) {
if (eventUser.isAnonymous()) {
if (user != null) {
if (user.isAnonymous()) {
logger.info("logging in as anonymous!!!");
ret = eventUser;
} else if (eventUser.checkPassword(password)) {
ret = eventUser;
} else {
secubean.logMessage(SecurityLogType.permissionDenied, eventUser.getUser(), "Login failed: wrong password for username ", username);
} else if (!user.checkPassword(password)) {
secubean.logMessage(SecurityLogType.permissionDenied, eventUser, "Login failed: wrong password for username ", username);
eventUser = null;
user = null;
}
if (user != null && eventUser == null)
{
LanEvent event = eventbean.getCurrentEvent();
eventUser = new EventUser(user, event, null);
// eventUser.setCreator(eventUser);
eventUserFacade.create(eventUser);
eventUserFacade.flush();
eventUser.setCreator(eventUser);
}
} else {
secubean.logMessage(SecurityLogType.permissionDenied, (User) null, "Login failed: Username not found: ", username);
secubean.logMessage(SecurityLogType.permissionDenied, eventbean.getCurrentEvent(), null, "Login failed: Username not found: ", username);
}
return ret;
return eventUser;
}
// public static void foo()
// {
// if (user != null) {
// LanEvent event = eventbean.getCurrentEvent();
// eventUser = new EventUser(user, event, null);
// // eventUser.setCreator(eventUser);
// eventUserFacade.create(eventUser);
// eventUserFacade.flush();
// eventUser.setCreator(eventUser);
// }
// }
@Override
public boolean authenticate(String username, String password) {
boolean ret = (tryLogin(username, password) != null);
......@@ -101,12 +118,12 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
roleset.add(SpecialPermission.ANONYMOUS.name());
}
if (!usr.isAnonymous()) {
if (!usr.getUser().isAnonymous()) {
roleset.add(SpecialPermission.USER.name());
}
// TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!!
if (usr.isSuperadmin()) {
if (usr.getUser().isSuperadmin()) {
for (BortalApplication app : BortalApplication.values()) {
for (IAppPermission perm : app.getPermissions()) {
roleset.add(perm.getFullName());
......@@ -123,7 +140,7 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
}
LanEvent event = eventbean.getCurrentEvent();
if (event != null && !usr.isAnonymous() && event.getDefaultRole() != null) {
if (event != null && !usr.getUser().isAnonymous() && event.getDefaultRole() != null) {
for (ApplicationPermission apperm : event.getDefaultRole().getPermissions()) {
roleset.add(apperm.getPermission().getFullName());
}
......
......@@ -14,6 +14,7 @@ import org.slf4j.Logger;
import fi.insomnia.bortal.facade.LogEntryFacade;
import fi.insomnia.bortal.facade.LogEntryTypeFacade;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LogEntry;
import fi.insomnia.bortal.model.LogEntryType;
import fi.insomnia.bortal.model.User;
......@@ -33,6 +34,8 @@ public class LoggingBean implements LoggingBeanLocal {
private LogEntryTypeFacade typeFacade;
@EJB
private LogEntryFacade entryFacade;
@EJB
private EventBeanLocal eventbean;
@Resource
UserTransaction utx;
......@@ -86,14 +89,19 @@ public class LoggingBean implements LoggingBeanLocal {
// }
@Override
public LogEntry logMessage(SecurityLogType paramType, User user,
public LogEntry logMessage(SecurityLogType paramType, LanEvent event, User user,
Object... description) {
LogEntry entry = null;
if (event == null)
{
event = eventbean.getCurrentEvent();
}
try {
String desc = toString(description);
utx.begin();
LogEntryType type = typeFacade.findOrCreate(paramType);
entry = new LogEntry(Calendar.getInstance());
entry.setParentEvent(event);
entry.setType(type);
entry.setDescription(desc);
entry.setUser(user);
......@@ -113,9 +121,15 @@ public class LoggingBean implements LoggingBeanLocal {
}
@Override
public LogEntry logMessage(SecurityLogType paramType, EventUser user,
Object... description) {
return logMessage(paramType, user.getUser(), description);
public LogEntry logMessage(SecurityLogType paramType, EventUser user, Object... description) {
LanEvent event = null;
User usr = null;
if (user != null)
{
event = user.getEvent();
usr = user.getUser();
}
return logMessage(paramType, event, usr, description);
}
private static final String toString(Object... desc) {
......
......@@ -26,7 +26,6 @@ import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.User;
@Stateless
......@@ -157,14 +156,19 @@ public class PermissionBean implements PermissionBeanLocal {
// }
@Override
public boolean isCurrentUser(IUser user) {
public boolean isCurrentUser(User user) {
return (context.getCallerPrincipal() == null || user == null) ? false : context.getCallerPrincipal().getName().equals(user.getLogin());
}
@Override
public boolean isCurrentUser(EventUser user) {
return user != null && isCurrentUser(user.getUser());
}
@Override
public boolean isLoggedIn() {
return !getAnonEventUser().equals(getCurrentUser()) || getCurrentUser().isSuperadmin();
return !getAnonEventUser().equals(getCurrentUser()) || getCurrentUser().getUser().isSuperadmin();
}
@Override
......@@ -189,12 +193,12 @@ public class PermissionBean implements PermissionBeanLocal {
User user = userfacade.findByLogin(User.ANONYMOUS_LOGINNAME);
if (user == null)
{
defaultUser = new EventUser(new User(), eventbean.getCurrentEvent());
defaultUser.setLogin(User.ANONYMOUS_LOGINNAME);
defaultUser.setNick(User.ANONYMOUS_LOGINNAME);
defaultUser = new EventUser(new User(), eventbean.getCurrentEvent(), null);
defaultUser.getUser().setLogin(User.ANONYMOUS_LOGINNAME);
defaultUser.getUser().setNick(User.ANONYMOUS_LOGINNAME);
} else {
defaultUser = new EventUser(user, eventbean.getCurrentEvent());
defaultUser = new EventUser(user, eventbean.getCurrentEvent(), null);
}
eventUserFacade.create(defaultUser);
eventUserFacade.flush();
......
......@@ -41,7 +41,6 @@ import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
......@@ -275,8 +274,8 @@ public class PlaceBean implements PlaceBeanLocal {
if (!p.isReservedFor(user)) {
throw new BortalCatchableException("Trying to buy place not reserved for that user");
}
logger.info("Buying place {} for user {}", p.getName(), user.getLogin());
GroupMembership gm = buy(p, pg, user);
logger.info("Buying place {} for user {}", p.getName(), user.getUser().getLogin());
GroupMembership gm = buy(p, pg);
if (!associatedToPlace)
{
logger.info("Associating buyer {} to place {}", user, gm);
......@@ -326,7 +325,7 @@ public class PlaceBean implements PlaceBeanLocal {
if (freePlace == null) {
throw new EJBException("Could find a place to be reserved....");
}
GroupMembership gm = buy(freePlace, pg, user);
GroupMembership gm = buy(freePlace, pg);
if (!associatedToPlace)
{
logger.info("Associating buyer {} to place {}", user, gm);
......@@ -349,7 +348,7 @@ public class PlaceBean implements PlaceBeanLocal {
return ret;
}
private GroupMembership buy(Place p, PlaceGroup pg, IUser user) {
private GroupMembership buy(Place p, PlaceGroup pg) {
p.setGroup(pg);
p.setReleaseTime(null);
// Current user temporarily used at place reservation. When buying
......@@ -451,7 +450,7 @@ public class PlaceBean implements PlaceBeanLocal {
@RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean releasePlace(Place place) {
place = placeFacade.find(place.getId());
IUser user = permbean.getCurrentUser();
EventUser user = permbean.getCurrentUser();
if (place.getGroup() != null || place.getCurrentUser() == null || (!permbean.hasPermission(MapPermission.MANAGE_OTHERS) && !place.getCurrentUser().equals(user))) {
return false;
}
......
......@@ -28,6 +28,7 @@ import fi.insomnia.bortal.facade.PlaceGroupFacade;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User;
/**
* Session Bean implementation class PlaceGroupBean
......@@ -164,7 +165,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
reserverLabel.setPosition(300, y + 30);
reserverLabel.drawOn(page);
TextLine reserver = new TextLine(font, new StringBuilder(membership.getPlaceGroup().getCreator().getWholeName()).append(" (").append(membership.getPlaceGroup().getCreator().getNick()).append(")").toString());
User creator = membership.getPlaceGroup().getCreator().getUser();
TextLine reserver = new TextLine(font, new StringBuilder(creator.getWholeName()).append(" (").append(creator.getNick()).append(")").toString());
reserver.setPosition(310, y + 45);
reserver.drawOn(page);
......@@ -172,7 +174,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
assoclabel.setPosition(300, y + 65);
assoclabel.drawOn(page);
TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getWholeName()).append(" (").append(membership.getUser().getNick()).append(")").toString()));
TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getUser().getWholeName()).append(" (").append(membership.getUser().getUser().getNick()).append(")").toString()));
assoc.setPosition(310, y + 80);
assoc.drawOn(page);
......
......@@ -103,7 +103,7 @@ public class TestDataBean implements TestDataBeanLocal {
u.setNick("kavija");
Calendar bday = Calendar.getInstance();
bday.set(Calendar.YEAR, 1990);
u.setBirthday(bday);
u.setBirthday(bday.getTime());
u.setCreated(Calendar.getInstance());
u.setEmail("kalle.kavija@example.com");
u.setFirstnames("Kalle Kauko");
......@@ -129,7 +129,7 @@ public class TestDataBean implements TestDataBeanLocal {
u.setNick("admin");
Calendar bday = Calendar.getInstance();
bday.set(Calendar.YEAR, 1980);
u.setBirthday(bday);
u.setBirthday(bday.getTime());
u.setCreated(Calendar.getInstance());
u.setEmail("admin@inter.net");
u.setFirstnames("Asko Admin");
......
......@@ -46,6 +46,7 @@ import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
/**
......@@ -205,10 +206,10 @@ public class UserBean implements UserBeanLocal {
userimage.setName(filename);
userimage.setDescription(description);
user.getUserImageList().add(userimage);
user.getUser().getUserImageList().add(userimage);
// setting uploaded image as the default.
user.setCurrentImage(userimage);
user.getUser().setCurrentImage(userimage);
return userimage;
}
......@@ -224,7 +225,7 @@ public class UserBean implements UserBeanLocal {
UserImage ret = null;
if (id == 0 && permbean.isLoggedIn()) {
ret = permbean.getCurrentUser().getCurrentImage();
ret = permbean.getCurrentUser().getUser().getCurrentImage();
} else {
ret = userimagefacade.find(id);
if (ret != null && !permbean.isCurrentUser(ret.getUser()) && permbean.hasPermission(UserPermission.MODIFY)) {
......@@ -245,7 +246,7 @@ public class UserBean implements UserBeanLocal {
@RolesAllowed(UserPermission.S_CREATE_NEW)
public void createNewUser(EventUser user, String password) {
user.resetPassword(password);
user.getUser().resetPassword(password);
user.setEvent(eventBean.getCurrentEvent());
// Tallennetaan olio kantaan...
eventUserFacade.create(user);
......@@ -309,8 +310,8 @@ public class UserBean implements UserBeanLocal {
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public SearchResult<User> getUsers(int page, int pagesize, String sort, String search) {
return userFacade.searchUser(page, pagesize, sort, search);
public SearchResult<User> getUsers(SearchQuery search) {
return userFacade.searchAllUsers(search);
}
// @Override
......@@ -337,7 +338,7 @@ public class UserBean implements UserBeanLocal {
MailMessage msg = new MailMessage();
msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT));
msg.setMessage(MessageFormat.format(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_CONTENT), MessageFormat.format(url, token), creator.getWholeName()));
msg.setMessage(MessageFormat.format(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_CONTENT), MessageFormat.format(url, token), creator.getUser().getWholeName()));
msg.setToAddress(invitemail);
utilbean.sendMail(msg);
return true;
......@@ -420,7 +421,7 @@ public class UserBean implements UserBeanLocal {
@Override
@RolesAllowed(UserPermission.S_CREATE_NEW)
public EventUser createNewUser(User usr) {
EventUser evu = new EventUser(usr, eventBean.getCurrentEvent());
EventUser evu = new EventUser(usr, eventBean.getCurrentEvent(), permbean.getCurrentUser());
eventUserFacade.create(evu);
return evu;
}
......@@ -458,7 +459,7 @@ public class UserBean implements UserBeanLocal {
EventUser ret = eventUserFacade.find(user);
if (ret == null)
{
ret = new EventUser(user, eventBean.getCurrentEvent());
ret = new EventUser(user, eventBean.getCurrentEvent(), permbean.getCurrentUser());
eventUserFacade.create(ret);
eventUserFacade.flush();
}
......@@ -496,4 +497,15 @@ public class UserBean implements UserBeanLocal {
return user;
}
@Override
public SearchResult<User> getEventUsers(SearchQuery search) {
if (search.getSearch() == null || search.getSearch().isEmpty())
{
return userFacade.searchEventUsers(search);
} else {
return userFacade.searchAllUsers(search);
}
}
}
\ No newline at end of file
......@@ -36,16 +36,16 @@ public class UserUtilBean implements UserUtilBeanLocal {
@Override
public void convertUsernames() {
for (EventUser u : userbean.getUsers()) {
if (u.getLogin().trim().isEmpty()) {
if (u.getUser().getLogin().trim().isEmpty()) {
logger.warn("User {} has empty login...");
continue;
}
User testU = userfacade.findByLogin(u.getLogin().toLowerCase());
User testU = userfacade.findByLogin(u.getUser().getLogin().toLowerCase());
if (testU == null || testU.equals(u)) {
u.setLogin(u.getLogin().toLowerCase());
logger.info("Converted user {}", u.getLogin());
u.getUser().setLogin(u.getUser().getLogin().toLowerCase());
logger.info("Converted user {}", u.getUser().getLogin());
} else {
logger.warn("Could not convert user {}", u.getLogin(), testU.getLogin());
logger.warn("Could not convert user {}", u.getUser().getLogin(), testU.getLogin());
}
}
......
......@@ -42,7 +42,7 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
return getSingleNullableResult(getEm().createQuery(cq));
}
public EventUser find(User user) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
......@@ -64,7 +64,7 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
eventBean.getCurrentEvent()));
return getEm().createQuery(cq).getResultList();
}
public EventUser findByBarcode(String barcode) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
......@@ -75,7 +75,43 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
cb.equal(root.get(PrintedCard_.event), eventBean.getCurrentEvent())
);
return getSingleNullableResult(getEm().createQuery(cq));
}
// public SearchResult<EventUser> searchUser(int page, int pagesize, String
// sort, String search) {
//
// List<FacadeCallback<EventUser>> callbacks = new
// ArrayList<FacadeCallback<EventUser>>();
// if (sort == null || sort.isEmpty()) {
// callbacks.add(new OrderCallback<EventUser>(false, EventUser_.id));
// } else {
// callbacks.add(new OrderCallback<EventUser>(false, sort));
// }
//
// if (search == null || search.isEmpty()) {
// callbacks.add(new EventUserEventlimiter(eventBean.getCurrentEvent()));
// }
// callbacks.add(new EventUserSearchCreator(search,
// UserFacade.getAttrlist()));
// return super.searcher(page, pagesize, callbacks);
//
// // return this.search(page, pagesize, query, NAMEFIELDS, sort);
// }
//
// public class EventUserEventlimiter implements FacadeCallback<EventUser> {
//
// private LanEvent ev;
//
// public EventUserEventlimiter(LanEvent currentEvent) {
// ev = currentEvent;
// }
//
// @Override
// public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser>
// root, List<Predicate> predicates) {
// predicates.add(cb.equal(root.get(EventUser), ev));
// }
// }
}
......@@ -9,21 +9,20 @@ import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public abstract class GenericFacade<C extends ModelInterface> {
private final Class<C> entClass;
private static final Logger logger = LoggerFactory.getLogger(GenericFacade.class);
// private static final Logger logger =
// LoggerFactory.getLogger(GenericFacade.class);
public GenericFacade(Class<C> entityClass) {
this.entClass = entityClass;
......@@ -110,53 +109,55 @@ public abstract class GenericFacade<C extends ModelInterface> {
return ret;
}
@Deprecated
protected List<C> search(String query, String[] fields, String orderfield) {
return search(0, 0, query, fields, orderfield);
}
@Deprecated
protected SearchResult<C> searcher(int page, int pagesize, String query, String[] fields, String orderfield) {
SearchResult<C> ret = new SearchResult<C>();
ret.setResults(search(page, pagesize, query, fields, orderfield));
ret.setResultcount(searchCount(query, fields));
return ret;
}
// @Deprecated
// protected List<C> search(String query, String[] fields, String
// orderfield) {
// return search(0, 0, query, fields, orderfield);
// }
//
// @Deprecated
// protected SearchResult<C> searcher(int page, int pagesize, String query,
// String[] fields, String orderfield) {
// SearchResult<C> ret = new SearchResult<C>();
// ret.setResults(search(page, pagesize, query, fields, orderfield));
// ret.setResultcount(searchCount(query, fields));
// return ret;
// }
// Le fu... Tuota.. generics ei hanskaa ... operaattoria.. tehdään siis
// näin... :(
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> callback) {
return searcher(page, pagesize, Collections.singletonList(callback));
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) {
return searcher(search, Collections.singletonList(callback));
}
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> cb1, FacadeCallback<C> cb2) {
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> cb1, FacadeCallback<C> cb2) {
ArrayList<FacadeCallback<C>> cbs = new ArrayList<FacadeCallback<C>>();
cbs.add(cb1);
cbs.add(cb2);
return searcher(page, pagesize, cbs);
return searcher(search, cbs);
}
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3) {
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3) {
ArrayList<FacadeCallback<C>> cbs = new ArrayList<FacadeCallback<C>>();
cbs.add(cb1);
cbs.add(cb2);
cbs.add(cb3);
return searcher(page, pagesize, cbs);
return searcher(search, cbs);
}
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3, FacadeCallback<C> cb4) {
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3, FacadeCallback<C> cb4) {
ArrayList<FacadeCallback<C>> cbs = new ArrayList<FacadeCallback<C>>();
cbs.add(cb1);
cbs.add(cb2);
cbs.add(cb3);
cbs.add(cb4);
return searcher(page, pagesize, cbs);
return searcher(search, cbs);
}
protected SearchResult<C> searcher(int page, int pagesize, List<FacadeCallback<C>> list) {
protected SearchResult<C> searcher(SearchQuery search, List<FacadeCallback<C>> list) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<C> listCQuery = cb.createQuery(getEntityClass());
......@@ -169,22 +170,28 @@ public abstract class GenericFacade<C extends ModelInterface> {
TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
TypedQuery<C> listQ = getEm().createQuery(listCQuery);
if (pagesize > 0) {
listQ.setFirstResult(page * pagesize);
listQ.setMaxResults(pagesize);
if (search.getPagesize() > 0) {
listQ.setFirstResult(search.getPage() * search.getPagesize());
listQ.setMaxResults(search.getPagesize());
}
return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult());
}
private Root<C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) {
protected Root<C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) {
return searchCallbacks(cq, list, getEntityClass());
}
protected <T extends ModelInterface> Root<T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
Root<C> root = cq.from(getEntityClass());
Root<T> root = cq.from(clazz);
ArrayList<Predicate> predicates = new ArrayList<Predicate>();
for (FacadeCallback<C> fc : list) {
fc.exec(cb, cq, root, predicates);
for (FacadeCallback<T> fc : list) {
if (fc != null) {
fc.exec(cb, cq, root, predicates);
}
}
if (!predicates.isEmpty()) {
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
......@@ -195,52 +202,55 @@ public abstract class GenericFacade<C extends ModelInterface> {
}
@Deprecated
protected List<C> search(int page, int pagesize, String query, String[] fields, String orderfield) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<C> cq = cb.createQuery(getEntityClass());
Root<C> root = cq.from(getEntityClass());
addPredicates(cq, root, query, fields);
TypedQuery<C> q = getEm().createQuery(cq);
if (pagesize > 0) {
q.setFirstResult(page * pagesize);
q.setMaxResults(pagesize);
}
List<C> ret = q.getResultList();
return ret;
}
@Deprecated
protected void addPredicates(CriteriaQuery<?> cq, Root<C> root, String query, String[] fields) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
if (query != null && !query.isEmpty() && fields != null && fields.length > 0) {
List<Predicate> preds = new ArrayList<Predicate>();
for (String field : fields) {
Path<String> rootfield = root.get(field);
preds.add(cb.like(cb.lower(rootfield), query));
}
cq.where(cb.or(preds.toArray(new Predicate[preds.size()])));
}
}
@Deprecated
protected long searchCount(String query, String[] fields) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<C> root = cq.from(getEntityClass());
addPredicates(cq, root, query, fields);
cq.select(getEm().getCriteriaBuilder().count(root));
TypedQuery<Long> q = getEm().createQuery(cq);
return q.getSingleResult();
}
// @Deprecated
// protected List<C> search(int page, int pagesize, String query, String[]
// fields, String orderfield) {
//
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<C> cq = cb.createQuery(getEntityClass());
//
// Root<C> root = cq.from(getEntityClass());
//
// addPredicates(cq, root, query, fields);
//
// TypedQuery<C> q = getEm().createQuery(cq);
// if (pagesize > 0) {
// q.setFirstResult(page * pagesize);
// q.setMaxResults(pagesize);
//
// }
// List<C> ret = q.getResultList();
// return ret;
// }
//
// @Deprecated
// protected void addPredicates(CriteriaQuery<?> cq, Root<C> root, String
// query, String[] fields) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// if (query != null && !query.isEmpty() && fields != null && fields.length
// > 0) {
// List<Predicate> preds = new ArrayList<Predicate>();
// for (String field : fields) {
// Path<String> rootfield = root.get(field);
// preds.add(cb.like(cb.lower(rootfield), query));
// }
// cq.where(cb.or(preds.toArray(new Predicate[preds.size()])));
// }
//
// }
//
// @Deprecated
// protected long searchCount(String query, String[] fields) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<Long> cq = cb.createQuery(Long.class);
// Root<C> root = cq.from(getEntityClass());
//
// addPredicates(cq, root, query, fields);
// cq.select(getEm().getCriteriaBuilder().count(root));
//
// TypedQuery<Long> q = getEm().createQuery(cq);
// return q.getSingleResult();
// }
// @Deprecated
// public List<C> findAll(int page, int pagesize, String sort) {
......
......@@ -4,20 +4,30 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.facade.callbacks.OrderCallback;
import fi.insomnia.bortal.facade.callbacks.StringSearchPredicateCreator;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.User_;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
@Stateless
......@@ -28,7 +38,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
private static List<SingularAttribute<User, String>> SEARCHATTRS;
private List<SingularAttribute<User, String>> getAttrlist() {
static List<SingularAttribute<User, String>> getAttrlist() {
if (SEARCHATTRS == null)
{
ArrayList<SingularAttribute<User, String>> buildAttrs = new ArrayList<SingularAttribute<User, String>>();
......@@ -46,6 +56,9 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
return SEARCHATTRS;
}
@EJB
private EventBeanLocal eventBean;
// final String[] NAMEFIELDS = { "nick", "login", "firstnames", "lastname",
// "email" };
......@@ -92,23 +105,17 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
return super.merge(user);
}
public SearchResult<User> searchUser(int page, int pagesize, String sort, String search) {
OrderCallback<User> orderCall = null;
if (sort == null || sort.isEmpty()) {
orderCall = new OrderCallback<User>(false, User_.id);
}
else
{
orderCall = new OrderCallback<User>(false, sort);
public SearchResult<User> searchAllUsers(SearchQuery search) {
List<FacadeCallback<User>> callbacks = new ArrayList<FacadeCallback<User>>();
if (search.getSort() == null || search.getSort().isEmpty()) {
callbacks.add(new OrderCallback<User>(false, User_.id));
} else {
callbacks.add(new OrderCallback<User>(false, search.getSort()));
}
callbacks.add(new StringSearchPredicateCreator<User>(search.getSearch(), getAttrlist()));
return super.searcher(page, pagesize,
new StringSearchPredicateCreator<User>(search, getAttrlist()),
orderCall
);
return super.searcher(search, callbacks);
// return this.search(page, pagesize, query, NAMEFIELDS, sort);
}
......@@ -139,7 +146,47 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
return getEm().createQuery(cq).getResultList();
}
public SearchResult<User> searchEventUsers(SearchQuery query)
{
ArrayList<FacadeCallback<EventUser>> callbacks = new ArrayList<FacadeCallback<EventUser>>();
callbacks.add(new OrderCallback<EventUser>(false, EventUser_.id));
callbacks.add(new Eventlimiter(eventBean.getCurrentEvent()));
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> listCQuery = cb.createQuery(User.class);
CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);
Root<EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
Root<EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);
listCQuery.select(listRoot.join(EventUser_.user));
countCQuery.select(cb.count(countRoot.get(EventUser_.user)));
TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
TypedQuery<User> listQ = getEm().createQuery(listCQuery);
if (query.getPagesize() > 0) {
listQ.setFirstResult(query.getPage() * query.getPagesize());
listQ.setMaxResults(query.getPagesize());
}
return new SearchResult<User>(listQ.getResultList(), countQ.getSingleResult());
}
public class Eventlimiter implements FacadeCallback<EventUser> {
private LanEvent ev;
public Eventlimiter(LanEvent currentEvent) {
ev = currentEvent;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) {
predicates.add(cb.equal(root.get(EventUser_.event), ev));
}
}
}
......@@ -5,8 +5,8 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
......@@ -26,7 +26,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) {
if (searchval == null || attributes == null || attributes.isEmpty()) {
return;
}
......
package fi.insomnia.bortal.facade.callbacks;
import java.util.List;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.User;
public class EventUserSearchCreator extends PathStringSearchPredicateCreator<EventUser, User> {
public EventUserSearchCreator(String search, List<SingularAttribute<User, String>> attrs) {
super(search, attrs);
}
public EventUserSearchCreator(String search, SingularAttribute<User, String> from) {
super(search, from);
}
@Override
protected Path<User> getPath(Path<EventUser> root) {
return root.get(EventUser_.user);
}
}
......@@ -4,12 +4,15 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public interface FacadeCallback<C extends ModelInterface> {
void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root, List<Predicate> predicates);
// void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root,
// List<Predicate> predicates);
void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<C> root, List<Predicate> predicates);
}
......@@ -4,8 +4,8 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger;
......@@ -24,7 +24,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
......
......@@ -6,7 +6,6 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
......@@ -30,7 +29,7 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) {
Class<?> rettype = cq.getResultType();
// Check if returntype is entity or are we for example counting results
......
package fi.insomnia.bortal.facade.callbacks;
import java.util.Collections;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public abstract class PathStringSearchPredicateCreator<T extends ModelInterface, D extends ModelInterface> implements FacadeCallback<T> {
private static final String WILDCARD = "%";
private String searchstr = null;
private List<SingularAttribute<D, String>> attributes = null;
public PathStringSearchPredicateCreator(String search, List<SingularAttribute<D, String>> attrs) {
if (addSearch(search)) {
attributes = attrs;
}
}
public PathStringSearchPredicateCreator(String search, SingularAttribute<D, String> from) {
if (addSearch(search)) {
attributes = Collections.singletonList(from);
}
}
private boolean addSearch(String search) {
if (search != null) {
search = search.trim().toLowerCase();
if (!search.isEmpty()) {
searchstr = new StringBuilder().append(WILDCARD).append(search).append(WILDCARD).toString();
return true;
}
}
searchstr = null;
return false;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> path, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
Path<D> entityPath = getPath(path);
for (String splitSearch : searchstr.split(" "))
{
splitSearch = splitSearch.trim();
if (splitSearch.isEmpty())
continue;
splitSearch = new StringBuilder().append(WILDCARD).append(splitSearch).append(WILDCARD).toString();
Predicate[] preds = new Predicate[attributes.size()];
int i = 0;
for (SingularAttribute<D, String> attr : attributes) {
preds[i++] = cb.like(cb.lower(entityPath.get(attr)), splitSearch);
}
predicates.add(cb.or(preds));
}
}
protected abstract Path<D> getPath(Path<T> root);
}
package fi.insomnia.bortal.facade.callbacks;
import java.util.Collections;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public class StringSearchPredicateCreator<T extends ModelInterface> implements FacadeCallback<T> {
private static final String WILDCARD = "%";
private String searchstr = null;
private List<SingularAttribute<T, String>> attributes = null;
public class StringSearchPredicateCreator<T extends ModelInterface> extends PathStringSearchPredicateCreator<T, T> {
public StringSearchPredicateCreator(String search, List<SingularAttribute<T, String>> attrs) {
if (addSearch(search)) {
attributes = attrs;
}
super(search, attrs);
}
public StringSearchPredicateCreator(String search, SingularAttribute<T, String> from) {
if (addSearch(search)) {
attributes = Collections.singletonList(from);
}
}
private boolean addSearch(String search) {
if (search != null) {
search = search.trim().toLowerCase();
if (!search.isEmpty()) {
searchstr = new StringBuilder().append(WILDCARD).append(search).append(WILDCARD).toString();
return true;
}
}
searchstr = null;
return false;
super(search, from);
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
for (String splitSearch : searchstr.split(" "))
{
splitSearch = new StringBuilder().append(WILDCARD).append(splitSearch.trim()).append(WILDCARD).toString();
Predicate[] preds = new Predicate[attributes.size()];
int i = 0;
for (SingularAttribute<T, String> attr : attributes) {
preds[i++] = cb.like(cb.lower(root.get(attr)), splitSearch);
}
predicates.add(cb.or(preds));
}
protected Path<T> getPath(Path<T> root) {
return root;
}
}
......@@ -3,13 +3,14 @@ package fi.insomnia.bortal.beans;
import javax.ejb.Local;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LogEntry;
import fi.insomnia.bortal.model.User;
@Local
public interface LoggingBeanLocal {
LogEntry logMessage(SecurityLogType paramType, User user, Object... description);
LogEntry logMessage(SecurityLogType paramType, LanEvent event, User user, Object... description);
LogEntry logMessage(SecurityLogType paramType, EventUser user, Object... description);
......
......@@ -5,7 +5,7 @@ import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.User;
@Local
public interface PermissionBeanLocal {
......@@ -16,8 +16,6 @@ public interface PermissionBeanLocal {
boolean isLoggedIn();
boolean isCurrentUser(IUser thisuser);
// boolean fatalPermission(IAppPermission perm, Object... failmessage);
// throws PermissionDeniedException;
......@@ -37,6 +35,10 @@ public interface PermissionBeanLocal {
EventUser getAnonEventUser();
boolean isCurrentUser(User user);
boolean isCurrentUser(EventUser user);
// boolean hasPermission(String perm);
}
......@@ -10,6 +10,7 @@ import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
@Local
......@@ -17,7 +18,9 @@ public interface UserBeanLocal {
List<EventUser> getUsers();
SearchResult<User> getUsers(int page, int pagesize, String sort, String search);
SearchResult<User> getUsers(SearchQuery search);
SearchResult<User> getEventUsers(SearchQuery search);
EventUser mergeChanges(EventUser user);
......@@ -65,7 +68,7 @@ public interface UserBeanLocal {
EventUser getEventUser(User user);
EventUser validateUser(String username, String password);
EventUser getUserByBarcode(String barcode);
}
......@@ -3,6 +3,9 @@ package fi.insomnia.bortal.clientutils;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.apps.IAppPermission;
public class BortalLocalContextHolder {
......@@ -10,18 +13,29 @@ public class BortalLocalContextHolder {
private static final ThreadLocal<BortalLocalContextHolder> THREAD_WITH_CONTEXT = new ThreadLocal<BortalLocalContextHolder>();
private String hostname;
private boolean ssl = false;
private Integer hostnameId;
private final Map<IAppPermission, Boolean> rightcache = new HashMap<IAppPermission, Boolean>();
private static boolean inDevelopmentMode = false;
public BortalLocalContextHolder() {
private static final Logger logger = LoggerFactory.getLogger(BortalLocalContextHolder.class);
private BortalLocalContextHolder() {
super();
}
private BortalLocalContextHolder(BortalLocalContextHolder old) {
super();
this.hostname = old.hostname;
this.ssl = old.ssl;
}
public static void setHostname(String hostname) {
getThread().hostname = hostname;
logger.info("Setting hostname to {}", hostname);
}
......@@ -84,4 +98,19 @@ public class BortalLocalContextHolder {
getThread().hostnameId = id;
}
public static boolean isSsl() {
return getThread().ssl;
}
public static void setSsl(boolean ssl) {
getThread().ssl = ssl;
}
public static void copy(BortalLocalContextHolder contextHolder) {
logger.debug("Copying context holder to new. Hostname {} ", contextHolder.getHolderHostname());
if (THREAD_WITH_CONTEXT.get() != null) {
logger.warn("Context for thread is not empty. Received hostname {}", THREAD_WITH_CONTEXT.get().hostname);
}
THREAD_WITH_CONTEXT.set(new BortalLocalContextHolder(contextHolder));
}
}
\ No newline at end of file
......@@ -5,7 +5,7 @@ import java.io.UnsupportedEncodingException;
import javax.mail.internet.InternetAddress;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.User;
public class MailMessage implements Serializable {
/**
......@@ -99,7 +99,7 @@ public class MailMessage implements Serializable {
return charset;
}
public void setTo(IUser user) {
public void setTo(User user) {
setToName(user.getWholeName());
setToAddress(user.getEmail());
......
......@@ -193,9 +193,9 @@ public class Bill extends GenericEntity {
public Bill(LanEvent event, EventUser user) {
this(event);
this.setUser(user);
this.setAddr1(user.getFirstnames() + " " + user.getLastname());
this.setAddr2(user.getAddress());
this.setAddr3(user.getZip() + " " + user.getTown());
this.setAddr1(user.getUser().getFirstnames() + " " + user.getUser().getLastname());
this.setAddr2(user.getUser().getAddress());
this.setAddr3(user.getUser().getZip() + " " + user.getUser().getTown());
}
public Bill(LanEvent event) {
......
......@@ -9,9 +9,11 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
......@@ -20,6 +22,8 @@ import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.eclipse.persistence.annotations.OptimisticLocking;
......@@ -30,7 +34,7 @@ import fi.insomnia.bortal.enums.Gender;
@Entity
@Table(name = "event_users", uniqueConstraints = @UniqueConstraint(columnNames = { EventUser.USER_ID_COLUMN, EventUser.EVENT_ID_COLUMN }))
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class EventUser extends GenericEntity implements IUser {
public class EventUser extends GenericEntity {
protected static final String USER_ID_COLUMN = "user_id";
protected static final String EVENT_ID_COLUMN = "event_id";
......@@ -38,6 +42,7 @@ public class EventUser extends GenericEntity implements IUser {
@ManyToOne(cascade = { PERSIST, MERGE, REFRESH, DETACH })
@JoinColumn(nullable = false, name = USER_ID_COLUMN)
private User user;
@ManyToOne
@JoinColumn(nullable = false, name = EVENT_ID_COLUMN)
private LanEvent event;
......@@ -92,13 +97,39 @@ public class EventUser extends GenericEntity implements IUser {
@OneToMany(mappedBy = "user")
private List<PollAnswer> pollAnswers;
@ManyToOne()
@JoinColumn(name = "creator")
private EventUser creator;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "createtime", nullable = false, updatable = false)
private Date eventuserCreated;
public EventUser getCreator() {
return creator;
}
public void setCreator(EventUser creator) {
this.creator = creator;
}
public Date getEventuserCreated() {
return eventuserCreated;
}
public void setEventuserCreated(Date eventuserCreated) {
this.eventuserCreated = eventuserCreated;
}
public EventUser()
{
super();
}
public EventUser(User usr, LanEvent evnt) {
public EventUser(User usr, LanEvent evnt, EventUser usercreator) {
super();
this.eventuserCreated = new Date();
this.creator = usercreator;
this.user = usr;
this.event = evnt;
}
......@@ -223,222 +254,178 @@ public class EventUser extends GenericEntity implements IUser {
this.pollAnswers = pollAnswers;
}
@Override
public void setCreated(Calendar created) {
user.setCreated(created);
}
@Override
public boolean getActive() {
return user.getActive();
}
@Override
public void setActive(boolean active) {
user.setActive(active);
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public void setPassword(String password) {
user.setPassword(password);
}
@Override
public String getWholeName() {
return user.getWholeName();
}
@Override
public String getLastname() {
return user.getLastname();
}
@Override
public void setLastname(String lastname) {
user.setLastname(lastname);
}
@Override
public String getFirstnames() {
return user.getFirstnames();
}
@Override
public void setFirstnames(String firstnames) {
user.setFirstnames(firstnames);
}
@Override
public Calendar getBirthday() {
public Date getBirthday() {
return user.getBirthday();
}
@Override
public void setBirthday(Calendar birthday) {
public void setBirthday(Date birthday) {
user.setBirthday(birthday);
}
@Override
public String getNick() {
return user.getNick();
}
@Override
public void setNick(String nick) {
user.setNick(nick);
}
@Override
public String getEmail() {
return user.getEmail();
}
@Override
public void setEmail(String email) {
user.setEmail(email);
}
@Override
public String getAddress() {
return user.getAddress();
}
@Override
public void setAddress(String address) {
user.setAddress(address);
}
@Override
public String getZip() {
return user.getZip();
}
@Override
public void setZip(String zip) {
user.setZip(zip);
}
@Override
public String getTown() {
return user.getTown();
}
@Override
public void setTown(String town) {
user.setTown(town);
}
@Override
public String getPhone() {
return user.getPhone();
}
@Override
public void setPhone(String phone) {
user.setPhone(phone);
}
@Override
public String getLogin() {
return user.getLogin();
}
@Override
public void setLogin(String login) {
user.setLogin(login);
}
@Override
public List<UserImage> getUserImageList() {
return user.getUserImageList();
}
@Override
public void setUserImageList(List<UserImage> userImageList) {
user.setUserImageList(userImageList);
}
@Override
public String getConfirmHash() {
return user.getConfirmHash();
}
@Override
public void setConfirmHash(String confirmHash) {
user.setConfirmHash(confirmHash);
}
@Override
public Calendar getConfirmTime() {
return user.getConfirmTime();
}
@Override
public void setConfirmTime(Calendar confirmTime) {
user.setConfirmTime(confirmTime);
}
@Override
public void resetPassword(String password) {
user.resetPassword(password);
}
@Override
public boolean checkPassword(String plainPassword) {
return user.checkPassword(plainPassword);
}
@Override
public void setSuperadmin(boolean superadmin) {
user.setSuperadmin(superadmin);
}
@Override
public boolean isSuperadmin() {
return user.isSuperadmin();
}
@Override
public void setPostalTown(String postalTown) {
user.setPostalTown(postalTown);
}
@Override
public String getPostalTown() {
return user.getPostalTown();
}
@Override
public void setGender(Gender gender) {
user.setGender(gender);
}
@Override
public Gender getGender() {
return user.getGender();
}
@Override
public void setCurrentImage(UserImage currentImage) {
user.setCurrentImage(currentImage);
}
@Override
public UserImage getCurrentImage() {
return user.getCurrentImage();
}
@Override
public boolean isAnonymous() {
return user.isAnonymous();
}
@Override
public Calendar getCreated() {
return user.getCreated();
}
......
package fi.insomnia.bortal.model;
import java.util.Date;
import javax.annotation.Generated;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-13T00:35:53.118+0300")
@Generated(value="Dali", date="2012-09-09T05:12:41.679+0300")
@StaticMetamodel(EventUser.class)
public class EventUser_ extends GenericEntity_ {
public static volatile SingularAttribute<EventUser, User> user;
......@@ -23,4 +24,6 @@ public class EventUser_ extends GenericEntity_ {
public static volatile ListAttribute<EventUser, Bill> bills;
public static volatile ListAttribute<EventUser, AccountEvent> soldItems;
public static volatile ListAttribute<EventUser, PollAnswer> pollAnswers;
public static volatile SingularAttribute<EventUser, EventUser> creator;
public static volatile SingularAttribute<EventUser, Date> eventuserCreated;
}
package fi.insomnia.bortal.model;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import fi.insomnia.bortal.enums.Gender;
......@@ -29,9 +30,9 @@ public interface IUser {
public abstract void setFirstnames(String firstnames);
public abstract Calendar getBirthday();
public abstract Date getBirthday();
public abstract void setBirthday(Calendar birthday);
public abstract void setBirthday(Date birthday);
public abstract String getNick();
......
......@@ -5,7 +5,7 @@ import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-12T19:23:44.258+0300")
@Generated(value="Dali", date="2012-09-11T02:27:08.849+0300")
@StaticMetamodel(LogEntry.class)
public class LogEntry_ extends GenericEntity_ {
public static volatile SingularAttribute<LogEntry, LanEvent> parentEvent;
......
......@@ -6,9 +6,10 @@ import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-09-09T02:58:31.995+0300")
@Generated(value="Dali", date="2012-09-10T17:55:33.516+0300")
@StaticMetamodel(Reader.class)
public class Reader_ extends GenericEntity_ {
public static volatile SingularAttribute<Reader, ReaderType> type;
public static volatile SingularAttribute<Reader, LanEvent> event;
public static volatile SingularAttribute<Reader, Integer> gamepoints;
public static volatile SingularAttribute<Reader, Integer> maxEvents;
......@@ -20,5 +21,4 @@ public class Reader_ extends GenericEntity_ {
public static volatile SingularAttribute<Reader, Integer> mapX;
public static volatile SingularAttribute<Reader, Integer> mapY;
public static volatile ListAttribute<Reader, ReaderEvent> events;
public static volatile SingularAttribute<Reader, ReaderType> type;
}
package fi.insomnia.bortal.model;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
......@@ -37,7 +38,7 @@ public class User extends GenericEntity implements IUser {
public static final String ANONYMOUS_LOGINNAME = "anonymous";
private static final long serialVersionUID = -1632200627103418206L;
@Column(name = "created", nullable = false)
@Column(name = "created", nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar created = Calendar.getInstance();
......@@ -59,7 +60,7 @@ public class User extends GenericEntity implements IUser {
@Column(name = "birthday")
@Temporal(TemporalType.TIMESTAMP)
private Calendar birthday;
private Date birthday;
@Column(name = "nick")
private String nick = "";
......@@ -173,12 +174,12 @@ public class User extends GenericEntity implements IUser {
}
@Override
public Calendar getBirthday() {
public Date getBirthday() {
return birthday;
}
@Override
public void setBirthday(Calendar birthday) {
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
......
......@@ -2,12 +2,13 @@ package fi.insomnia.bortal.model;
import fi.insomnia.bortal.enums.Gender;
import java.util.Calendar;
import java.util.Date;
import javax.annotation.Generated;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-13T14:47:41.939+0300")
@Generated(value="Dali", date="2012-09-09T04:13:51.037+0300")
@StaticMetamodel(User.class)
public class User_ extends GenericEntity_ {
public static volatile SingularAttribute<User, Calendar> created;
......@@ -16,7 +17,7 @@ public class User_ extends GenericEntity_ {
public static volatile SingularAttribute<User, String> password;
public static volatile SingularAttribute<User, String> lastname;
public static volatile SingularAttribute<User, String> firstnames;
public static volatile SingularAttribute<User, Calendar> birthday;
public static volatile SingularAttribute<User, Date> birthday;
public static volatile SingularAttribute<User, String> nick;
public static volatile SingularAttribute<User, String> email;
public static volatile SingularAttribute<User, String> address;
......
......@@ -5,7 +5,6 @@ import java.util.TimeZone;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
......@@ -14,10 +13,9 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.beans.RoleBeanLocal;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.EventUser;
@Named()
@RequestScoped
......@@ -26,11 +24,11 @@ public class SessionHandler {
private static final Logger logger = LoggerFactory
.getLogger(SessionHandler.class);
//@Inject
//private HttpServletRequest httprequest;
// @Inject
// private HttpServletRequest httprequest;
//@EJB
//private RoleBeanLocal rolebean;
// @EJB
// private RoleBeanLocal rolebean;
@EJB
private EventBeanLocal eventbean;
......@@ -45,14 +43,14 @@ public class SessionHandler {
public String getLocale() {
// TODO: Locale selection code missing
// return "en_ST_v7";
//return "fi_IN_XIII";
// return "fi_IN_XIII";
return "fi_FI";
}
public String getLayout() {
// TODO: layout selection code missing!!
// return "stream1";
//return "insomnia2";
// return "insomnia2";
return "default";
}
......@@ -81,11 +79,11 @@ public class SessionHandler {
}
public boolean isSuperadmin() {
return permbean.getCurrentUser().isSuperadmin();
return permbean.getCurrentUser().getUser().isSuperadmin();
}
public IUser getCurrentUser() {
public EventUser getCurrentUser() {
return permbean.getCurrentUser();
}
......
package fi.insomnia.bortal.utilities;
import java.io.Serializable;
public class SearchQuery implements Serializable {
private static final long serialVersionUID = -8777921789916093938L;
private int page = 0;
private int pagesize = 20;
private String sort = null;
private String search = null;
public SearchQuery()
{
super();
}
public SearchQuery(int page, int pagesize, String sort, String search) {
super();
this.page = page;
this.pagesize = pagesize;
this.sort = sort;
this.search = search;
}
public int getPage() {
return page;
}
public void setPage(int page) {
if (page < 0) {
this.page = 0;
} else
{
this.page = page;
}
}
public int getPagesize() {
if (pagesize < 1) {
pagesize = 20;
}
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getSearch() {
return search;
}
public void setSearch(String search) {
this.search = search;
}
public void addPage(Integer count) {
if (count != null) {
page += count;
}
}
}
......@@ -13,5 +13,6 @@
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry combineaccessrules="false" kind="src" path="/lib-AuthModule-depends"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
......@@ -21,6 +21,16 @@
</arguments>
</buildCommand>
<buildCommand>
<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.jboss.tools.cdi.core.cdibuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
......@@ -32,5 +42,7 @@
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
<nature>org.jboss.tools.cdi.core.cdinature</nature>
</natures>
</projectDescription>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>LanBortalWeb</display-name>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
<!-- <param-value>Development</param-value> -->
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<servlet-mapping>
<servlet-name>PlaceMap</servlet-name>
<url-pattern>/PlaceMap</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsf</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.wtf</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</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>UserImageServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserImageServlet</servlet-name>
<url-pattern>/Userimage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserCardServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserCardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserCardServlet</servlet-name>
<url-pattern>/UserCard</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CardTemplateServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.CardTemplateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CardTemplateServlet</servlet-name>
<url-pattern>/CardTemplate</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>PlaceMap</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceMap</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
<url-pattern>*.wtf</url-pattern>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter>
<display-name>HostnameFilter</display-name>
<filter-name>HostnameFilter</filter-name>
<filter-class>fi.insomnia.bortal.HostnameFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HostnameFilter</filter-name>
<servlet-name>*</servlet-name>
</filter-mapping>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>omniarealm</realm-name>
<form-login-config>
<form-login-page>/auth/login.jsf</form-login-page>
<form-error-page>/auth/loginError.jsf</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<display-name>Forbidden resource</display-name>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/layout/*</url-pattern>
<url-pattern>/resources/tools/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Thou shall not read the sources or use utils directly</description>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<servlet>
<description></description>
<display-name>PrintBill</display-name>
<servlet-name>PrintBill</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PrintBill</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintBill</servlet-name>
<url-pattern>/PrintBill</url-pattern>
</servlet-mapping>
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
<servlet>
<description></description>
<display-name>PlaceGroupPdf</display-name>
<servlet-name>PlaceGroupPdf</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceGroupPdf</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PlaceGroupPdf</servlet-name>
<url-pattern>/PlaceGroupPdf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bortal</param-value>
</context-param>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LanBortalWeb</display-name>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<servlet-mapping>
<servlet-name>PlaceMap</servlet-name>
<url-pattern>/PlaceMap</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsf</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.wtf</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</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>UserImageServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserImageServlet</servlet-name>
<url-pattern>/Userimage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserCardServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserCardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserCardServlet</servlet-name>
<url-pattern>/UserCard</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CardTemplateServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.CardTemplateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CardTemplateServlet</servlet-name>
<url-pattern>/CardTemplate</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>PlaceMap</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceMap</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
<url-pattern>*.wtf</url-pattern>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter>
<display-name>HostnameFilter</display-name>
<filter-name>HostnameFilter</filter-name>
<filter-class>fi.insomnia.bortal.HostnameFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HostnameFilter</filter-name>
<servlet-name>*</servlet-name>
</filter-mapping>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>omniarealm</realm-name>
<form-login-config>
<form-login-page>/auth/login.jsf</form-login-page>
<form-error-page>/auth/loginError.jsf</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<display-name>Forbidden resource</display-name>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/layout/*</url-pattern>
<url-pattern>/resources/tools/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Thou shall not read the sources or use utils directly</description>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<servlet>
<description></description>
<display-name>PrintBill</display-name>
<servlet-name>PrintBill</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PrintBill</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintBill</servlet-name>
<url-pattern>/PrintBill</url-pattern>
</servlet-mapping>
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
<servlet>
<description></description>
<display-name>PlaceGroupPdf</display-name>
<servlet-name>PlaceGroupPdf</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceGroupPdf</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PlaceGroupPdf</servlet-name>
<url-pattern>/PlaceGroupPdf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bortal</param-value>
</context-param>
</web-app>
\ No newline at end of file
......@@ -38,24 +38,24 @@
});
</script>
</ui:fragment>
<ui:fragment rendered="#{billEditView.checkoutFiAvailable}">
<table border="0">
<tr>
<ui:repeat varStatus="idx" value="#{billEditView.checkoutFiToken}" var="bank">
<td>
<form action="#{bank.url}" method="post">
<ui:repeat value="#{bank.postParams}" var="valp" >
<input type="hidden" name="#{valp.key}" value="#{valp.value}" />
</ui:repeat>
<input type='image' src='#{bank.icon}' />
</form>
</td>
<h:outputText escape="false" value="&lt;/tr>&lt;tr>" rendered="#{idx.index % 4 == 3}"/>
</ui:repeat>
</tr>
</table>
<ui:fragment rendered="#{billEditView.checkoutFiAvailable}">
<table border="0">
<tr>
<ui:repeat varStatus="idx" value="#{billEditView.checkoutFiToken}" var="bank">
<td>
<form action="#{bank.url}" method="post">
<ui:repeat value="#{bank.postParams}" var="valp">
<input type="hidden" name="#{valp.key}" value="#{valp.value}" />
</ui:repeat>
<input type='image' src='#{bank.icon}' />
</form>
</td>
<h:outputText escape="false" value="&lt;/tr>&lt;tr>" rendered="#{idx.index % 4 == 3}" />
</ui:repeat>
</tr>
</table>
</ui:fragment>
</ui:define>
......
......@@ -13,7 +13,7 @@
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/style/insomnia2/css/tyyli.css" />
<ui:insert name="headerdata" />
<h:outputScript name="prime_calendar.js" library="script" />
</h:head>
<h:body>
<div id="header">
......
......@@ -14,10 +14,10 @@
<h:panelGrid columns="2" columnClasses="topalign,topalign">
<h:outputLabel for="billnr" value="#{i18n['bill.billNumber']}:" />
<h:outputText id="billnr" value="#{cc.attrs.bill.billNumber}" />
<h:outputLabel for="refnr" value="#{i18n['bill.referencenumber']}" />
<h:outputText id="refnr" value="#{cc.attrs.bill.referenceNumber}" />
<h:outputLabel for="billAmount" value="#{i18n['bill.billAmount']}" />
<h:outputText id="billAmount" value="#{cc.attrs.bill.totalPrice()}">
<f:convertNumber maxFractionDigits="2" minFractionDigits="2" />
......@@ -71,6 +71,48 @@
</h:panelGrid>
</h:panelGrid>
<h2>#{i18n['bill.billLines']}</h2>
<h:dataTable styleClass="border" border="1" value="#{cc.attrs.bill.billLines}" var="line">
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['billine.name']}" />
</f:facet>
<h:outputText value="#{line.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['billine.quantity']}" />
</f:facet>
<h:outputText value="#{line.quantity}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['billine.unitName']}" />
</f:facet>
<h:outputText value="#{line.unitName}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['billine.unitPrice']}" />
</f:facet>
<h:outputText value="#{line.unitPrice}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['billine.linePrice']}" />
</f:facet>
<h:outputText value="#{line.linePrice}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</h:column>
</h:dataTable>
</composite:implementation>
</html>
......@@ -30,7 +30,7 @@
<h:inputSecret id="gridPwd" value="#{authView.password}" />
</h:panelGrid>
<h:commandButton id="gridsubmit" action="#{authView.executeLogin()}" value="#{i18n['login.submit']}" />
<h:commandButton id="gridsubmit" actionListener="#{authView.executeLogin()}" value="#{i18n['login.submit']}" />
</c:otherwise>
</c:choose>
......
......@@ -52,6 +52,7 @@
<f:ajax render="@form" />
</h:commandButton>
<h:inputText size="4" id="cartcount" value="#{cart.count}">
<f:convertNumber maxIntegerDigits="2" minFractionDigits="0"/>
<f:ajax render="@form" event="valueChange" listener="#{productShopView.updateCartLimits}"/>
</h:inputText>
<h:commandButton action="#{productShopView.add(1)}" value="#{i18n['productshop.plusOne']}">
......
......@@ -17,12 +17,14 @@
<h:outputText value="#{i18n['nasty.user']}" />
</f:facet>
<ui:include src="form.xhtml" />
<h:commandButton rendered="#{roleView.canWriteRoles()}" id="saverole" value="#{i18n['save']}" action="#{roleView.save}" />
<h:commandButton rendered="#{roleView.canWriteRoles()}" id="saverole" value="#{i18n['roleView.save']}" action="#{roleView.save}" />
</h:form>
</p>
<h2>#{i18n['role.permissionheader']}</h2>
<p>
<h:form>
<h:form id="permissionform">
<h:commandButton id="save" value="#{i18n['role.savePermissions']}" action="#{roleView.savePermissions}" />
<h:dataTable border="1" id="bortalApps" value="#{roleView.rolePermissions}" var="bapp">
<h:column>
<f:facet name="header">
......@@ -37,7 +39,7 @@
<h:outputText value="#{i18n[bapp.key]}" />
</h:column>
<h:column>
<h:selectManyCheckbox layout="pageDirection" value="#{bapp.selected}">
<h:selectManyCheckbox id="permissions" layout="pageDirection" value="#{bapp.selected}">
<f:selectItems value="#{bapp.permissions}" var="per" itemLabel="#{i18n[per.i18nKey]}" />
</h:selectManyCheckbox>
<!-- <ui:repeat id="permDescs" var="perm" value="#{bapp.permissions}"> -->
......
......@@ -28,6 +28,11 @@
<f:param value="#{rr.id}" name="readerId" />
</h:link>
</h:column>
<h:column>
<h:link outcome="/shop/editReader" value="#{i18n['reader.edit']}">
<f:param value="#{rr.id}" name="readerId" />
</h:link>
</h:column>
</h:dataTable>
</composite:implementation>
......
......@@ -3,7 +3,7 @@
"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" >
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<composite:interface>
......@@ -70,12 +70,7 @@
<h:message for="town" />
<h:outputLabel rendered="#{sessionHandler.superadmin}" value="#{i18n['user.superadmin']}:" for="superadmin" />
<h:selectBooleanCheckbox disabled="#{!cc.attrs.creating and !userView.canSave()}"
rendered="#{sessionHandler.superadmin}" id="superadmin" value="#{userView.selectedUser.superadmin}"
/>
<h:message rendered="#{sessionHandler.superadmin}" for="superadmin" />
<!--
<h:outputLabel value="#{i18n['user.defaultImage']}:" for="currentImage" />
<h:selectOneMenu rendered="#{sessionHandler.hasPermission('USER', 'READ')}" id="currentImage" value="#{userView.selectedUser.currentImage}" converter="#{userimageConverter}" >
......@@ -91,6 +86,11 @@
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
</h:selectOneRadio>
<h:message for="sex" />
<h:outputLabel for="birthday" value="#{i18n['user.birthday']}:"/>
<p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" locale="fi" value="#{userView.selectedUser.birthday}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" />
<h:message for="birthday" />
<h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.password']}:" for="password" />
......@@ -105,6 +105,14 @@
/>
<h:message rendered="#{cc.attrs.creating}" for="passwordcheck" />
<h:outputLabel rendered="#{sessionHandler.superadmin}" value="#{i18n['user.superadmin']}:" for="superadmin" />
<h:selectBooleanCheckbox disabled="#{!cc.attrs.creating and !userView.canSave()}"
rendered="#{sessionHandler.superadmin}" id="superadmin" value="#{userView.selectedUser.superadmin}"
/>
<h:message rendered="#{sessionHandler.superadmin}" for="superadmin" />
<h:commandButton rendered="#{cc.attrs.creating or userView.canSave()}" id="commitbtn"
action="#{cc.attrs.commitaction}" value="#{cc.attrs.commitvalue}"
/>
......
PrimeFaces.locales ['fi'] = {
closeText: 'Sulje',
prevText: 'Edellinen',
nextText: 'Seuraava',
monthNames: ['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu' ],
monthNamesShort: ['Tammi', 'Helmi', 'Maalis', 'Huhti', 'Touko', 'Kesä', 'Heinä', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu' ],
dayNames: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
dayNamesShort: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
dayNamesMin: ['S', 'M', 'T', 'K ', 'T', 'P ', 'L'],
weekHeader: 'Viikko',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix:'',
timeOnlyTitle: 'Vain aika',
timeText: 'Aika',
hourText: 'Tunti',
minuteText: 'Minuutti',
secondText: 'Sekunti',
currentText: 'Tämä hetki',
ampm: false,
month: 'Kuukausi',
week: 'Viikko',
day: 'Päivä',
allDayText: 'Koko päivä'
};
\ No newline at end of file
......@@ -247,6 +247,12 @@ td ul {
#right ul li a:hover {
color: #7dac0c;
text-decoration: none;
}l
}
table {
border-collapse: collapse;
}
table.border td,table.border th {
padding: 1px 4px;
}
\ No newline at end of file
......@@ -88,6 +88,9 @@ public class HostnameFilter implements Filter {
// httpRequest.getSession().setAttribute(EventBeanLocal.HTTP_URL_HOSTNAME,
// hostname);
String proto = url.substring(0, 5).toLowerCase();
boolean ssl = proto.equals("https");
BortalLocalContextHolder.setSsl(ssl);
BortalLocalContextHolder.setHostname(hostname);
BortalLocalContextHolder.setInDevelopmentMode(developmentMode);
......@@ -104,8 +107,7 @@ public class HostnameFilter implements Filter {
httpRequest.login(User.ANONYMOUS_LOGINNAME, null);
} catch (Throwable t) {
logger.warn("Error logging in as anonymous... ignoring.. ",
t);
logger.warn("Error logging in as anonymous... ignoring.. ", t);
}
}
else if (!httpRequest.getUserPrincipal().getName().equals(User.ANONYMOUS_LOGINNAME))
......@@ -115,7 +117,7 @@ public class HostnameFilter implements Filter {
}
// pass the request along the filter chain
logger.warn("Hurrdurr...");
try {
chain.doFilter(request, response);
} finally {
......
......@@ -126,7 +126,7 @@ public class SessionHandler {
}
public boolean isSuperadmin() {
return permbean.getCurrentUser().isSuperadmin();
return permbean.getCurrentUser().getUser().isSuperadmin();
}
......
......@@ -38,6 +38,7 @@ bill.addr5 = Address 5
bill.address = Payers address
bill.billAmount = Bill amount
bill.billIsPaid = Bill is paid
bill.billLines = Products
bill.billNumber = Bill number
bill.billPaidDate = Paid date
bill.deliveryTerms = Delivery terms
......@@ -63,6 +64,7 @@ bill.totalPrice = Total
billedit.billnotfound = Bill not found. Select again.
billine.linePrice = Total
billine.name = Product
billine.quantity = Quantity
billine.referencedProduct = Referenced product
......@@ -236,8 +238,6 @@ mapView.errorWhenReservingPlace = Error when reserving place!
mapView.errorWhileBuyingPlaces = Error when buying places. Please try again. If error reoccurs please contact organizers.
mapView.notEnoughCreditsToReserve = You don't have enough credits to reserve this place.
mapedit.save = Save
nasty.user = Go away!
org.hibernate.validator.constraints.Email.message = not a well-formed email address
......@@ -390,28 +390,26 @@ poll.end = Close poll
poll.name = Poll name
poll.save = Send answers
product.barcode = Barcode
product.billed = Billed
product.boughtTotal = Products billed
product.cart.count = To shoppingcart
product.cashed = Cashpaid
product.color = Color in UI
product.create = Create product
product.createDiscount = Add volumediscount
product.edit = edit
product.name = Name of product
product.paid = Paid
product.prepaid = Prepaid
product.prepaidInstant = Created when prepaid is paid
product.price = Price of product
product.save = Save
product.shopInstant = Create automatic cashpayment
product.sort = Sort nr
product.totalPrice = Total
product.unitName = Unit name
product.vat = VAT
productShopView.readBarcode = Read
product.barcode = Barcode
product.billed = Billed
product.boughtTotal = Products billed
product.cart.count = To shoppingcart
product.cashed = Cashpaid
product.color = Color in UI
product.create = Create product
product.createDiscount = Add volumediscount
product.edit = edit
product.name = Name of product
product.paid = Paid
product.prepaid = Prepaid
product.prepaidInstant = Created when prepaid is paid
product.price = Price of product
product.save = Save
product.shopInstant = Create automatic cashpayment
product.sort = Sort nr
product.totalPrice = Total
product.unitName = Unit name
product.vat = VAT
products.save = Save
......@@ -445,22 +443,22 @@ resetMail.username = Username
resetmailSent.body = Email has been sent containing a link where you can change the password.
resetmailSent.header = Email sent
role.cardtemplate = Cardtemplate
role.create = Create role
role.description = Description
role.edit = Edit
role.edit.save = Save
role.execute = (X)
role.name = Name
role.parents = Parents
role.read = (R)
role.write = (W)
role.cardtemplate = Cardtemplate
role.create = Create role
role.description = Description
role.edit = Edit
role.edit.save = Save
role.execute = (X)
role.name = Name
role.parents = Parents
role.permissionheader = Role permissions
role.read = (R)
role.write = (W)
sendPicture.header = S
shop.accountBalance = Account balance
shop.cash = Cash deposit
shop.readBarcode = Read viivakoodi
shop.totalPrice = Price of products
shop.user = Selling to
......@@ -576,6 +574,7 @@ user.accountevents = Account events
user.address = Address
user.bank = Bank
user.bankaccount = Bank number
user.birthday = Birthday
user.cardPower = Usertype
user.changePassword = Change password
user.changepassword.forUser = For user
......
......@@ -38,6 +38,7 @@ bill.addr5 = Osoite 5
bill.address = Maksajan osoite
bill.billAmount = Laskun summa
bill.billIsPaid = Lasku on maksettu
bill.billLines = Tuotteet
bill.billNumber = Laskun numero
bill.billPaidDate = Maksup\u00E4iv\u00E4
bill.deliveryTerms = Toimitusehdot
......@@ -61,6 +62,7 @@ bill.show = N\u00E4yt\u00E4
bill.theirReference = Asiakkaan viite
bill.totalPrice = Laskun summa
billine.linePrice = Yhteens\u00E4
billine.name = Tuote
billine.quantity = Lukum\u00E4\u00E4r\u00E4
billine.referencedProduct = Tuoteviittaus
......@@ -243,8 +245,6 @@ mapView.errorWhenReservingPlace = Paikkaa varatessa tapahtui virhe.
mapView.errorWhileBuyingPlaces = Virhe paikkojen ostossa. Ole hyv\u00E4 ja yrit\u00E4 uudelleen. Jos virhe toistuu ota yhteytt\u00E4 j\u00E4rjest\u00E4jiin.
mapView.notEnoughCreditsToReserve = Sinulla ei ole riitt\u00E4v\u00E4sti suoritettuja konepaikkamaksuja t\u00E4m\u00E4n paikan varaamiseen.
mapedit.save = Tallenna
menu.index = Etusivu
menu.place.placemap = Paikkakartta
menu.poll.index = Kyselyt
......@@ -379,28 +379,26 @@ poll.end = Sulje kysely
poll.name = Kyselyn nimi
poll.save = L\u00E4het\u00E4 vastauksesi
product.barcode = Viivakoodi
product.billed = Laskutettu
product.boughtTotal = Tuotteita laskutettu
product.cart.count = Ostoskoriin
product.cashed = Ostettu k\u00E4teisell\u00E4
product.color = V\u00E4ri k\u00E4ytt\u00F6liittym\u00E4ss\u00E4
product.create = Luo tuote
product.createDiscount = Lis\u00E4\u00E4 m\u00E4\u00E4r\u00E4alennus
product.edit = Muokkaa
product.name = Tuotteen nimi
product.paid = Maksettu
product.prepaid = Prepaid
product.prepaidInstant = Luodaan kun prepaid maksetaan
product.price = Tuotteen hinta
product.save = Tallenna
product.shopInstant = Luo k\u00E4teismaksu tuotteille
product.sort = J\u00E4rjestys luku
product.totalPrice = Summa
product.unitName = Tuoteyksikk\u00F6
product.vat = ALV
productShopView.readBarcode = Lue
product.barcode = Viivakoodi
product.billed = Laskutettu
product.boughtTotal = Tuotteita laskutettu
product.cart.count = Ostoskoriin
product.cashed = Ostettu k\u00E4teisell\u00E4
product.color = V\u00E4ri k\u00E4ytt\u00F6liittym\u00E4ss\u00E4
product.create = Luo tuote
product.createDiscount = Lis\u00E4\u00E4 m\u00E4\u00E4r\u00E4alennus
product.edit = Muokkaa
product.name = Tuotteen nimi
product.paid = Maksettu
product.prepaid = Prepaid
product.prepaidInstant = Luodaan kun prepaid maksetaan
product.price = Tuotteen hinta
product.save = Tallenna
product.shopInstant = Luo k\u00E4teismaksu tuotteille
product.sort = J\u00E4rjestys luku
product.totalPrice = Summa
product.unitName = Tuoteyksikk\u00F6
product.vat = ALV
products.save = Tallenna
......@@ -447,7 +445,6 @@ sendPicture.header = L\u00E4het\u00E4 kuva
shop.accountBalance = Tilin saldo
shop.cash = K\u00E4teispano
shop.readBarcode = Lue viivakoodi
shop.totalPrice = Tuotteiden hinta
shop.user = Myyd\u00E4\u00E4n
......@@ -564,6 +561,7 @@ user.accountevents = Tilitapahtumat
user.address = Osoite
user.bank = Pankki
user.bankaccount = Pankkitili
user.birthday = Syntym\u00E4p\u00E4iv\u00E4
user.cardPower = K\u00E4ytt\u00E4j\u00E4tyyppi
user.changePassword = Vaihda salasana
user.changepassword.forUser = K\u00E4ytt\u00E4j\u00E4lle
......
package fi.insomnia.bortal.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.Environment;
import org.apache.sshd.server.ExitCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
public class BortalCommand implements Command, Runnable {
private static Logger logger = LoggerFactory.getLogger(BortalCommand.class);
private OutputStream errstream;
private ExitCallback exitCallback;
private InputStreamReader instream;
private OutputStreamWriter outstream;
private BortalLocalContextHolder contextHolder;
private Charset UTF8 = Charset.forName("UTF-8");
public BortalCommand(BortalLocalContextHolder context) {
contextHolder = context;
}
@Override
public void setInputStream(InputStream in) {
instream = new InputStreamReader(in, UTF8);
}
@Override
public void setOutputStream(OutputStream out) {
outstream = new OutputStreamWriter(out, UTF8);
}
@Override
public void setErrorStream(OutputStream err) {
errstream = err;
}
@Override
public void setExitCallback(ExitCallback callback) {
exitCallback = callback;
}
@Override
public void start(Environment env) throws IOException {
logger.info("Starting something...");
new Thread(this).start();
}
@Override
public void destroy() {
logger.info("destroying ssh command");
}
@Override
public void run() {
BortalLocalContextHolder.copy(contextHolder);
try {
logger.info("Created new bortalCommane");
outstream.write("Hello you...");
StringBuilder cmdBuilder = new StringBuilder();
while (true) {
if (!instream.ready()) {
Thread.sleep(100);
} else {
char inchar = (char) instream.read();
if (inchar == '\n' || inchar == '\r')
{
outstream.write("\r\n# ");
outstream.flush();
parseCommand(cmdBuilder.toString());
cmdBuilder = new StringBuilder();
}
else {
outstream.write(inchar);
outstream.flush();
cmdBuilder.append(inchar);
}
}
}
} catch (InterruptedException e) {
logger.warn("Running command interrupted", e);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
exitCallback.onExit(3);
}
private void parseCommand(String string) {
if (string != null || !string.isEmpty())
{
logger.info("received command {}", string);
}
}
}
package fi.insomnia.bortal.servlet;
import java.io.IOException;
import java.security.Principal;
import java.util.HashSet;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginContext;
import org.apache.sshd.server.PasswordAuthenticator;
import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.enterprise.security.auth.login.common.PasswordCredential;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
public class BortalPasswordAuthenticator implements PasswordAuthenticator {
private static final Logger logger = LoggerFactory.getLogger(BortalPasswordAuthenticator.class);
private BortalLocalContextHolder context;
public BortalPasswordAuthenticator(BortalLocalContextHolder instance) {
super();
context = instance;
}
@Override
public boolean authenticate(String username, String password, ServerSession session) {
BortalLocalContextHolder.copy(context);
return authenticate(username, password);
}
public boolean authenticate(final String username, final String password) {
try {
PasswordCredential pwdcred = new PasswordCredential(username, password.toCharArray(), "bortalRealm");
HashSet<PasswordCredential> privcred = new HashSet<PasswordCredential>();
privcred.add(pwdcred);
Subject subject = new Subject(false, new HashSet<Principal>(), new HashSet<Object>(), privcred);
LoginContext loginContext = new LoginContext("bortalRealm", subject, new CallbackHandler() {
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
Callback cb = callbacks[i];
logger.info("Handling callback. {}", cb);
if (cb instanceof NameCallback) {
logger.info("Handling name callback");
((NameCallback) callbacks[i]).setName(username);
} else if (cb instanceof PasswordCallback) {
logger.info("Handling password callback");
((PasswordCallback) cb).setPassword(password.toCharArray());
} else {
throw new UnsupportedCallbackException(cb);
}
}
}
});
loginContext.login();
// loginContext.logout();
return true;
} catch (Exception e) {
logger.error("Authentication failed with error", e);
return false;
}
}
}
......@@ -90,7 +90,7 @@ public class PlaceMap extends HttpServlet {
ostream = response.getOutputStream();
if (map == null || map.getMapData() == null) {
logger.info("Error handling map {}!", map);
logger.warn("Error handling map {}!", map);
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
ostream.print("Map error!");
......
package fi.insomnia.bortal.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.ejb.EJB;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.sshd.SshServer;
import org.apache.sshd.common.Factory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.model.LanEvent;
/**
* Servlet implementation class SshServlet
*/
@WebServlet(urlPatterns = "/ssh", loadOnStartup = 10)
public class SshServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(SshServlet.class);
private Map<Integer, SshServer> servers = new HashMap<Integer, SshServer>();
// Timeout 30 min
private static final String TIMEOUT = new Integer(1000 * 60 * 30).toString();
@EJB
private EventBeanLocal eventbean;
/**
* @see HttpServlet#HttpServlet()
*/
public SshServlet() {
super();
// TODO Auto-generated constructor stub
}
private class SshShellFactor implements Factory<Command> {
private BortalLocalContextHolder context;
public SshShellFactor(BortalLocalContextHolder instance) {
context = instance;
}
@Override
public Command create() {
logger.info("creating new bortal command");
return new BortalCommand(context);
}
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
}
private SshServer initSsh(Integer id) {
logger.info("Initializing ssh servlet");
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(8022);
sshd.getProperties().put(SshServer.IDLE_TIMEOUT, TIMEOUT);
sshd.setShellFactory(new SshShellFactor(BortalLocalContextHolder.getInstance()));
BortalPasswordAuthenticator pswdAuth = new BortalPasswordAuthenticator(BortalLocalContextHolder.getInstance());
sshd.setPasswordAuthenticator(pswdAuth);
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));
try {
sshd.start();
return sshd;
} catch (IOException e) {
logger.warn("sshd start failed! ", e);
}
return null;
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
logger.info("Destroying ssh servlet");
for (Entry<Integer, SshServer> entry : servers.entrySet())
{
try {
entry.getValue().stop();
} catch (InterruptedException e) {
logger.warn("Error stopping ssh", e);
}
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
LanEvent event = eventbean.getCurrentEvent();
if (!servers.containsKey(event.getId())) {
SshServer ssh = initSsh(event.getId());
if (ssh != null) {
servers.put(event.getId(), ssh);
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
......@@ -88,7 +88,7 @@ public class UserCardServlet extends GenericImageServlet {
EventUser user = card.getUser();
BufferedImage face = ImageIO.read(new ByteArrayInputStream(user.getCurrentImage().getImageData()));
BufferedImage face = ImageIO.read(new ByteArrayInputStream(user.getUser().getCurrentImage().getImageData()));
BufferedImage base = ImageIO.read(new ByteArrayInputStream(card.getTemplate().getImage()));
......@@ -107,12 +107,12 @@ public class UserCardServlet extends GenericImageServlet {
// g.getFontMetrics().charsWidth(nick.toCharArray(), 0, nick.length()),
// 840);
g.drawString(user.getNick(), 50, 810);
g.drawString(user.getUser().getNick(), 50, 810);
g.setFont(new Font("Century gothic", Font.BOLD, 35));
StringBuilder wholeName = new StringBuilder();
wholeName.append(user.getFirstnames()).append(" ").append(user.getLastname());
wholeName.append(user.getUser().getFirstnames()).append(" ").append(user.getUser().getLastname());
// g.setFont(new Font("Arial", Font.BOLD, 35));
// g.drawString(name, 595 -
......
......@@ -7,18 +7,20 @@ import javax.faces.model.ListDataModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public abstract class PaginationView<T extends ModelInterface> extends GenericCDIView implements IPaginationView {
private static final long serialVersionUID = -1226554409762987631L;
protected Integer page = 0;
protected Integer pagesize = 20;
// protected Integer page = 0;
// protected Integer pagesize = 20;
private SearchQuery searchQuery = new SearchQuery();
protected Long resultcount = 0L;
private Long pagecount = 0L;
protected String sort;
protected String search;
// protected String sort;
// protected String search;
private List<T> results;
private ListDataModel<T> resultdatamodel;
private static Logger logger = LoggerFactory.getLogger(PaginationView.class);
......@@ -32,11 +34,10 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
public String addToPage(Integer count) {
pagechangeCallback();
if (count != null) {
page += count;
}
if (page >= pagecount) {
page = pagecount.intValue() - 1;
searchQuery.addPage(count);
if (searchQuery.getPage() >= pagecount) {
searchQuery.setPage(pagecount.intValue() - 1);
}
return null;
}
......@@ -50,17 +51,14 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
public String gotoFirstpage() {
// logger.info("Setting page to first page");
pagechangeCallback();
page = 0;
searchQuery.setPage(0);
return null;
}
public String gotoLastpage() {
// logger.info("Setting page to last page");
pagechangeCallback();
page = pagecount.intValue() - 1;
if (page < 0) {
page = 0;
}
searchQuery.setPage(pagecount.intValue() - 1);
return null;
}
......@@ -74,23 +72,20 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
@Override
public Integer getPage() {
return page;
return searchQuery.getPage();
}
public void setPage(Integer page) {
this.page = page;
searchQuery.setPage(page);
}
@Override
public Integer getPagesize() {
if (pagesize < 1) {
pagesize = 20;
}
return pagesize;
return searchQuery.getPagesize();
}
public void setPagesize(Integer pagesize) {
this.pagesize = pagesize;
searchQuery.setPagesize(pagesize);
}
@Override
......@@ -100,7 +95,7 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
public void setResultcount(Long resultcount) {
this.resultcount = resultcount;
pagecount = ((resultcount + pagesize - 1) / pagesize);
pagecount = ((resultcount + searchQuery.getPagesize() - 1) / searchQuery.getPagesize());
}
@Override
......@@ -113,24 +108,24 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
}
public String getSort() {
return sort;
return searchQuery.getSort();
}
public void setSort(String sort) {
this.sort = sort;
searchQuery.setSort(sort);
}
public String getSearch() {
return search;
return searchQuery.getSearch();
}
public void setSearch(String search) {
this.search = search;
searchQuery.setSearch(search);
}
public String newSearch() {
logger.info("Setting new Search for pagination..");
page = 0;
setPage(0);
setResults(null);
resultdatamodel = null;
return null;
......@@ -145,4 +140,12 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
resultdatamodel = null;
}
public SearchQuery getSearchQuery() {
return searchQuery;
}
public void setSearchQuery(SearchQuery searchQuery) {
this.searchQuery = searchQuery;
}
}
......@@ -147,7 +147,7 @@ public class MapManageView extends GenericCDIView {
return null;
}
public void generatePlaces() {
public String generatePlaces() {
String[] tablenames = getNamebase().split(";");
List<Place> mapplaces = map.getPlaces();
......@@ -185,7 +185,7 @@ public class MapManageView extends GenericCDIView {
map = eventmapBean.saveMap(map);
logger.debug("places in map merge {}", map.getPlaces().size());
return null;
}
public void setMapname(String mapname) {
......
......@@ -78,7 +78,7 @@ public class MapView extends GenericCDIView {
public Long getPlacesLeftToSelect() {
Long ret = placeMapBean.selectablePlaceCount(getActiveMap());
logger.info("Got {} places left for map {}", ret, getActiveMap());
logger.debug("Got {} places left for map {}", ret, getActiveMap());
return ret;
}
......@@ -88,7 +88,7 @@ public class MapView extends GenericCDIView {
Long ret = placeMapBean.availablePlaceCount(getActiveMap());
logger.info("Got {} availbale places for map {}", ret, getActiveMap());
logger.debug("Got {} availbale places for map {}", ret, getActiveMap());
return ret;
}
......
......@@ -23,6 +23,7 @@ import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.web.annotations.SelectedUser;
import fi.insomnia.bortal.web.cdiview.GenericCDIView;
......@@ -41,7 +42,7 @@ public class PlaceView extends GenericCDIView {
@EJB
private transient UserBeanLocal userbean;
@EJB
private transient PlaceBeanLocal placebean;
......@@ -153,7 +154,7 @@ public class PlaceView extends GenericCDIView {
public String searchUser() {
super.beginConversation();
userlist = new ListDataModel<User>(userbean.getUsers(0, 0, null, searchuser).getResults());
userlist = new ListDataModel<User>(userbean.getUsers(new SearchQuery(0, 0, null, searchuser)).getResults());
return null;
}
......
......@@ -51,7 +51,7 @@ public class EventOrgView extends GenericCDIView {
public void initCreate()
{
if (super.requirePermissions(user.isSuperadmin())) {
if (super.requirePermissions(user.getUser().isSuperadmin())) {
super.beginConversation();
}
}
......@@ -83,7 +83,7 @@ public class EventOrgView extends GenericCDIView {
public void initEdit() {
if ((super.requirePermissions(eventorgbean.hasOrgPermission(orgId) || user.isSuperadmin())) && eventorg == null) {
if ((super.requirePermissions(eventorgbean.hasOrgPermission(orgId) || user.getUser().isSuperadmin())) && eventorg == null) {
eventorg = eventorgbean.find(orgId);
super.beginConversation();
}
......@@ -96,9 +96,9 @@ public class EventOrgView extends GenericCDIView {
}
public void initListView() {
if (super.requirePermissions(user.isSuperadmin() || eventorgbean.hasOrgPermission(orgId))) {
if (super.requirePermissions(user.getUser().isSuperadmin() || eventorgbean.hasOrgPermission(orgId))) {
if (getUser().isSuperadmin()) {
if (getUser().getUser().isSuperadmin()) {
setOrganisations(eventorgbean.getEventOrganisers());
} else {
setOrganisations(eventorgbean.getOrganisations(getUser().getUser()));
......@@ -108,7 +108,7 @@ public class EventOrgView extends GenericCDIView {
public void initEditEvent()
{
if (eventid != null && super.requirePermissions(user.isSuperadmin() || eventorgbean.hasEventPermission(eventid)) && getEvent() == null)
if (eventid != null && super.requirePermissions(user.getUser().isSuperadmin() || eventorgbean.hasEventPermission(eventid)) && getEvent() == null)
{
setEvent(eventorgbean.findEvent(eventid));
super.beginConversation();
......
......@@ -41,7 +41,7 @@ public class InviteAcceptView extends GenericCDIView {
this.addFaceMessage("invite.notFound");
done = true;
} else if (user == null) {
user = new EventUser(new User(), null);
user = new EventUser(new User(), null, permbean.getCurrentUser());
userview.setUser(user);
super.beginConversation();
}
......@@ -50,7 +50,7 @@ public class InviteAcceptView extends GenericCDIView {
public String createUser() {
user.resetPassword(userview.getPassword());
user.getUser().resetPassword(userview.getPassword());
userbean.createFromToken(user, token);
super.addFaceMessage("invite.userCreateSuccessfull");
done = true;
......
......@@ -68,7 +68,7 @@ public class ProductShopView extends GenericCDIView {
shoppingcart = new ListDataModel<ProductShopItem>(
ProductShopItem.productList(productBean
.listUserShoppableProducts()));
updateCartLimits();
updateCartLimits(null);
logger.debug("Initialized billing shoppingcart to {}", shoppingcart);
this.beginConversation();
}
......@@ -82,7 +82,7 @@ public class ProductShopView extends GenericCDIView {
shoppingcart = new ListDataModel<ProductShopItem>(
ProductShopItem.productGTList(productBean
.findForStaffshop()));
updateCartLimits();
updateCartLimits(null);
logger.debug("Initialized shoppingcart to {}", shoppingcart);
this.beginConversation();
}
......@@ -92,12 +92,12 @@ public class ProductShopView extends GenericCDIView {
ProductShopItem item = shoppingcart.getRowData();
item.setCount(item.getCount().add(BigDecimal.valueOf(count)));
updateCartLimits();
updateCartLimits(item);
return null;
}
public void updateCartLimits() {
public void updateCartLimits(ProductShopItem item) {
Map<Integer, BigDecimal> prodCounts = new HashMap<Integer, BigDecimal>();
for (ProductShopItem sc : shoppingcart) {
......@@ -107,6 +107,17 @@ public class ProductShopView extends GenericCDIView {
HashMap<Integer, BigDecimal> limits = productBean.getProductLimit(
prodCounts, user);
// Update the updated cart first
if (item != null)
{
BigDecimal l = limits.get(item.getProduct().getId());
if (item.updateLimit(l))
{
updateCartLimits(null);
return;
}
}
for (ProductShopItem n : shoppingcart) {
BigDecimal l = limits.get(n.getProduct().getId());
if (l != null) {
......
......@@ -17,6 +17,7 @@ import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.ReaderEvent;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named
......@@ -72,7 +73,7 @@ public class ReaderView extends GenericCDIView {
if (usersearch == null || usersearch.length() < 2) {
super.addFaceMessage("user.tooShortSearch");
} else {
userlist = UserCardWrapper.initWrapper(userbean.getUsers(0, 0, null, usersearch).getResults(), userbean);
userlist = UserCardWrapper.initWrapper(userbean.getUsers(new SearchQuery(0, 0, null, usersearch)).getResults(), userbean);
}
return null;
......
......@@ -99,7 +99,7 @@ public class AuthView extends GenericCDIView {
}
}
return;
}
public String getLogin() {
......
......@@ -33,7 +33,7 @@ public class PasswordView extends GenericCDIView {
public String changePassword() {
if (permbean.isCurrentUser(user) || permbean.hasPermission(UserPermission.MODIFY)) {
if (password != null && password.equals(passwordcheck)) {
user.resetPassword(password);
user.getUser().resetPassword(password);
user = userbean.mergeChanges(user);
} else {
super.addFaceMessage("userview.passwordsDontMatch");
......
......@@ -23,7 +23,7 @@ public class UserSearchView extends PaginationView<User> {
public void initView() {
if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) {
super.setResult(userbean.getUsers(page, pagesize, sort, search));
super.setResult(userbean.getEventUsers(getSearchQuery()));
}
}
......
......@@ -129,7 +129,7 @@ public class UserView extends GenericCDIView {
logger.info("Cropped data bytesize {}, type {}", croppedImage.getBytes().length, croppedImage.getOriginalFilename());
try {
UserImage newImage =
userbean.saveCroppedImage(user.getCurrentImage(),
userbean.saveCroppedImage(user.getUser().getCurrentImage(),
croppedImage.getLeft(), croppedImage.getTop(),
croppedImage.getWidth(), croppedImage.getHeight());
user = userbean.getEventUser(newImage.getUser());
......@@ -166,7 +166,7 @@ public class UserView extends GenericCDIView {
public void initCreateView() {
if (super.requirePermissions(UserPermission.CREATE_NEW)) {
user = new EventUser(new User(), eventbean.getCurrentEvent());
user = new EventUser(new User(), eventbean.getCurrentEvent(), permbean.getCurrentUser());
super.beginConversation();
}
}
......@@ -186,7 +186,7 @@ public class UserView extends GenericCDIView {
canSave = getCurrentUser().equals(user) || permbean.hasPermission(UserPermission.MODIFY);
this.beginConversation();
logger.info("Accountevents for user {}", user.getAccountEvents().size());
logger.debug("Accountevents for user {}", user.getAccountEvents().size());
}
......
......@@ -69,6 +69,7 @@ public class ProductShopItem {
count = BigDecimal.ZERO;
}
this.count = count;
price = product.getPrice().abs().multiply(count);
discounts = product.getActiveDiscounts(count, Calendar.getInstance());
discountValues = new HashMap<Integer, BigDecimal>();
......@@ -119,18 +120,20 @@ public class ProductShopItem {
return limit;
}
public void updateLimit(BigDecimal limit) {
public boolean updateLimit(BigDecimal limit) {
if (limit != null && limit.compareTo(BigDecimal.ZERO) < 0)
{
logger.info("product limit {}, count {}", limit, count);
setCount(getCount().add(limit));
if (getCount().compareTo(BigDecimal.ZERO) < 0)
if (count.compareTo(BigDecimal.ZERO) < 0)
{
setCount(BigDecimal.ZERO);
}
limit = BigDecimal.ZERO;
return true;
}
setLimit(limit);
return false;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry exported="true" kind="lib" path="security.jar"/>
<classpathentry exported="true" kind="lib" path="security.jar" sourcepath="/Users/tuomari/Downloads/security-3.1-sources.jar"/>
<classpathentry exported="true" kind="lib" path="common-util.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!