Commit 47e28be6 by Tuomas Riihimäki

Muutettu oikeusjärjestelmä. Laskujen ja paikkojen varaus toteutettu ja testattu

1 parent e03df159
Showing with 1599 additions and 1122 deletions
...@@ -68,6 +68,7 @@ public class BortalLoginModule extends AppservPasswordLoginModule { ...@@ -68,6 +68,7 @@ public class BortalLoginModule extends AppservPasswordLoginModule {
@Override @Override
protected void authenticateUser() throws LoginException { protected void authenticateUser() throws LoginException {
log((new StringBuilder()).append("CustomRealm Auth Info:_username:") log((new StringBuilder()).append("CustomRealm Auth Info:_username:")
.append(_username) .append(_username)
// .append(";_password:").append(_passwd) // .append(";_password:").append(_passwd)
......
...@@ -75,7 +75,6 @@ public class BortalRealm extends AppservRealm { ...@@ -75,7 +75,6 @@ public class BortalRealm extends AppservRealm {
throws BadRealmException, NoSuchRealmException { throws BadRealmException, NoSuchRealmException {
super.init(properties); super.init(properties);
log("Init BortalRealm"); log("Init BortalRealm");
String propJaasContext = properties.getProperty(JAAS_CONTEXT_PARAM); String propJaasContext = properties.getProperty(JAAS_CONTEXT_PARAM);
if (propJaasContext != null) { if (propJaasContext != null) {
setProperty(JAAS_CONTEXT_PARAM, propJaasContext); setProperty(JAAS_CONTEXT_PARAM, propJaasContext);
......
...@@ -12,7 +12,5 @@ ...@@ -12,7 +12,5 @@
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="src" path="/LanBortalUtilities"/>
<classpathentry kind="src" path="/UtilClasses"/>
<classpathentry kind="output" path="build/classes"/> <classpathentry kind="output" path="build/classes"/>
</classpath> </classpath>
Manifest-Version: 1.0 Manifest-Version: 1.0
Class-Path: LanBortalBeansClient.jar Class-Path: LanBortalBeansClient.jar
lib/LanBortalUtilities.jar
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd"> <!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar> <sun-ejb-jar>
<security-role-mapping> <security-role-mapping>
<role-name>ANONYMOUS</role-name> <role-name>USER/READ_ROLES</role-name>
<group-name>ANONYMOUS</group-name> <group-name>USER/READ_ROLES</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>ORGANIZATION_ROOT</role-name> <role-name>USER/WRITE_ROLES</role-name>
<group-name>ORGANIZATION_ROOT</group-name> <group-name>USER/WRITE_ROLES</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>SUPERADMIN</role-name> <role-name>USER/VIEW_ALL</role-name>
<group-name>SUPERADMIN</group-name> <group-name>USER/VIEW_ALL</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>ADMIN_BASE</role-name> <role-name>USER/VIEW_SELF</role-name>
<group-name>ADMIN_BASE</group-name> <group-name>USER/VIEW_SELF</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>USER_BASE</role-name> <role-name>USER/CREATE_NEW</role-name>
<group-name>USER_BASE</group-name> <group-name>USER/CREATE_NEW</group-name>
<principal-name>ANONYMOUS</principal-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>LOGIN/READ</role-name> <role-name>USER/MODIFY</role-name>
<group-name>LOGIN/READ</group-name> <group-name>USER/MODIFY</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>LOGIN/WRITE</role-name> <role-name>SUPERADMIN</role-name>
<group-name>LOGIN/WRITE</group-name> <group-name>SUPERADMIN</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>LOGIN/EXECUTE</role-name> <role-name>BILL/WRITE_ALL</role-name>
<group-name>LOGIN/EXECUTE</group-name> <group-name>BILL/WRITE_ALL</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>USER_MANAGEMENT/READ</role-name> <role-name>POLL/ANSWER</role-name>
<group-name>USER_MANAGEMENT/READ</group-name> <group-name>POLL/ANSWER</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>USER_MANAGEMENT/WRITE</role-name> <role-name>POLL/ANSWER</role-name>
<group-name>USER_MANAGEMENT/WRITE</group-name> <group-name>POLL/ANSWER</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>USER_MANAGEMENT/EXECUTE</role-name> <role-name>POLL/VIEW_RESULTS</role-name>
<group-name>USER_MANAGEMENT/EXECUTE</group-name> <group-name>POLL/VIEW_RESULTS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>ACCOUNT_MANAGEMENT/READ</role-name> <role-name>POLL/CREATE</role-name>
<group-name>ACCOUNT_MANAGEMENT/READ</group-name> <group-name>POLL/CREATE</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>ACCOUNT_MANAGEMENT/WRITE</role-name> <role-name>BILL/READ_ALL</role-name>
<group-name>ACCOUNT_MANAGEMENT/WRITE</group-name> <group-name>BILL/READ_ALL</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>ACCOUNT_MANAGEMENT/EXECUTE</role-name> <role-name>BILL/CREATE_BILL</role-name>
<group-name>ACCOUNT_MANAGEMENT/EXECUTE</group-name> <group-name>BILL/CREATE_BILL</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>BILL/READ</role-name> <role-name>LOGIN/LOGOUT</role-name>
<group-name>BILL/READ</group-name> <group-name>LOGIN/LOGOUT</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>BILL/WRITE</role-name> <role-name>LOGIN/LOGIN</role-name>
<group-name>BILL/WRITE</group-name> <group-name>LOGIN/LOGIN</group-name>
<principal-name>ANONUMOUS</principal-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>BILL/EXECUTE</role-name> <role-name>MAP/MANAGE_OTHERS</role-name>
<group-name>BILL/EXECUTE</group-name> <group-name>MAP/MANAGE_OTHERS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>MAP/READ</role-name> <role-name>MAP/BUY_PLACES</role-name>
<group-name>MAP/READ</group-name> <group-name>MAP/BUY_PLACES</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>MAP/WRITE</role-name> <role-name>MAP/VIEW</role-name>
<group-name>MAP/WRITE</group-name> <group-name>MAP/VIEW</group-name>
<principal-name>ANONUMOUS</principal-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>MAP/EXECUTE</role-name> <role-name>MAP/MANAGE_MAPS</role-name>
<group-name>MAP/EXECUTE</group-name> <group-name>MAP/MANAGE_MAPS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>ROLE_MANAGEMENT/READ</role-name> <role-name>SHOP/LIST_ALL_PRODUCTS</role-name>
<group-name>ROLE_MANAGEMENT/READ</group-name> <group-name>SHOP/LIST_ALL_PRODUCTS</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ROLE_MANAGEMENT/WRITE</role-name>
<group-name>ROLE_MANAGEMENT/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ROLE_MANAGEMENT/EXECUTE</role-name>
<group-name>ROLE_MANAGEMENT/EXECUTE</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>PRODUCT/READ</role-name> <role-name>SHOP/MANAGE_PRODUCTS</role-name>
<group-name>PRODUCT/READ</group-name> <group-name>SHOP/MANAGE_PRODUCTS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>PRODUCT/WRITE</role-name> <role-name>ROLE_MANAGEMENT/WRITE</role-name>
<group-name>PRODUCT/WRITE</group-name> <group-name>ROLE_MANAGEMENT/WRITE</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>PRODUCT/EXECUTE</role-name> <role-name>SHOP/SHOP_PRODUCTS</role-name>
<group-name>PRODUCT/EXECUTE</group-name> <group-name>SHOP/SHOP_PRODUCTS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>SHOP/READ</role-name> <role-name>SHOP/LIST_USERPRODUCTS</role-name>
<group-name>SHOP/READ</group-name> <group-name>SHOP/LIST_USERPRODUCTS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>SHOP/WRITE</role-name> <role-name>USER</role-name>
<group-name>SHOP/WRITE</group-name> <group-name>USER</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>SHOP/EXECUTE</role-name>
<group-name>SHOP/EXECUTE</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>GAME/READ</role-name> <role-name>USER/LOGIN</role-name>
<group-name>GAME/READ</group-name> <group-name>USER/LOGIN</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>GAME/WRITE</role-name> <role-name>MAP/READ</role-name>
<group-name>GAME/WRITE</group-name> <group-name>MAP/READ</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>GAME/EXECUTE</role-name> <role-name>SHOP/SHOP_TO_OTHERS</role-name>
<group-name>GAME/EXECUTE</group-name> <group-name>SHOP/SHOP_TO_OTHERS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>POLL/READ</role-name> <role-name>ANONYMOUS</role-name>
<group-name>POLL/READ</group-name> <group-name>ANONYMOUS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>POLL/WRITE</role-name> <role-name>ANONYMOUS</role-name>
<group-name>POLL/WRITE</group-name> <group-name>ANONYMOUS</group-name>
</security-role-mapping> </security-role-mapping>
<security-role-mapping> <security-role-mapping>
<role-name>POLL/EXECUTE</role-name> <role-name>ANONYMOUS</role-name>
<group-name>POLL/EXECUTE</group-name> <group-name>ANONYMOUS</group-name>
</security-role-mapping> </security-role-mapping>
<enterprise-beans/>
<enterprise-beans/>
</sun-ejb-jar> </sun-ejb-jar>
package fi.insomnia.bortal;
public interface PermissionStrings {
}
...@@ -15,6 +15,8 @@ import javax.ejb.Stateless; ...@@ -15,6 +15,8 @@ import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.AccountEventFacade; import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.model.AccountEvent; import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.EventPk; import fi.insomnia.bortal.model.EventPk;
...@@ -27,7 +29,7 @@ import fi.insomnia.bortal.model.User; ...@@ -27,7 +29,7 @@ import fi.insomnia.bortal.model.User;
* Session Bean implementation class AccountEventBean * Session Bean implementation class AccountEventBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "ACCOUNT_MANAGEMENT/READ", "ACCOUNT_MANAGEMENT/WRITE", "SHOP/EXECUTE" }) @DeclareRoles({ UserPermission.S_VIEW_ACCOUNTEVENTS })
public class AccountEventBean implements AccountEventBeanLocal { public class AccountEventBean implements AccountEventBeanLocal {
@EJB @EJB
...@@ -53,13 +55,13 @@ public class AccountEventBean implements AccountEventBeanLocal { ...@@ -53,13 +55,13 @@ public class AccountEventBean implements AccountEventBeanLocal {
} }
@Override @Override
@RolesAllowed("ACCOUNT_MANAGEMENT/WRITE") @RolesAllowed(UserPermission.S_MODIFY_ACCOUNTEVENTS)
public AccountEvent merge(AccountEvent account) { public AccountEvent merge(AccountEvent account) {
return accountfacade.merge(account); return accountfacade.merge(account);
} }
@Override @Override
@RolesAllowed("ACCOUNT_MANAGEMENT/WRITE") @RolesAllowed(UserPermission.S_MODIFY_ACCOUNTEVENTS)
public void delete(AccountEvent account) { public void delete(AccountEvent account) {
AccountEvent acco = accountfacade.find(account.getId()); AccountEvent acco = accountfacade.find(account.getId());
...@@ -84,29 +86,39 @@ public class AccountEventBean implements AccountEventBeanLocal { ...@@ -84,29 +86,39 @@ public class AccountEventBean implements AccountEventBeanLocal {
return accountfacade.findProvidedRoles(eventBean.getCurrentEvent(), u); return accountfacade.findProvidedRoles(eventBean.getCurrentEvent(), u);
} }
/**
* Create accountevents for the products in the parameter shopMap
*/
@Override @Override
@RolesAllowed("SHOP/EXECUTE") @RolesAllowed(ShopPermission.S_SHOP_PRODUCTS)
public List<AccountEvent> shopCash(User shoppingUser, Map<Product, BigDecimal> shopMap, boolean buyInstant) throws PermissionDeniedException { public List<AccountEvent> shopCash(User shoppingUser, Map<Product, BigDecimal> shopMap, boolean buyInstant) throws PermissionDeniedException {
logger.debug("Shoping cash. buyinstant {}", buyInstant); logger.debug("Shoping cash. buyinstant {}", buyInstant);
User seller = permbean.getCurrentUser();
shoppingUser = userbean.findById(shoppingUser.getId());
ArrayList<AccountEvent> ret = new ArrayList<AccountEvent>(); ArrayList<AccountEvent> ret = new ArrayList<AccountEvent>();
LanEvent ev = eventBean.getCurrentEvent(); LanEvent ev = eventBean.getCurrentEvent();
User seller = permbean.getCurrentUser();
BigDecimal tot = BigDecimal.ZERO; BigDecimal tot = BigDecimal.ZERO;
for (Entry<Product, BigDecimal> prodentry : shopMap.entrySet()) { for (Entry<Product, BigDecimal> prodentry : shopMap.entrySet()) {
// Create account event for the product.
AccountEvent ac = new AccountEvent(ev, shoppingUser, prodentry.getKey(), prodentry.getKey().getPrice(), prodentry.getValue(), Calendar.getInstance()); AccountEvent ac = new AccountEvent(ev, shoppingUser, prodentry.getKey(), prodentry.getKey().getPrice(), prodentry.getValue(), Calendar.getInstance());
ac.setSeller(seller);
shoppingUser.getAccountEvents().add(ac);
if (buyInstant && prodentry.getKey().getPrice().compareTo(BigDecimal.ZERO) > 0) { if (buyInstant && prodentry.getKey().getPrice().compareTo(BigDecimal.ZERO) > 0) {
tot = tot.add(prodentry.getValue().multiply(prodentry.getKey().getPrice())); tot = tot.add(prodentry.getValue().multiply(prodentry.getKey().getPrice()));
} }
if (prodentry.getKey().isPrepaidInstant() && prodentry.getKey().getPlaces() != null && prodentry.getKey().getPlaces().size() > 0) { if (prodentry.getKey().isPrepaidInstant() && prodentry.getKey().getPlaces() != null && !prodentry.getKey().getPlaces().isEmpty()) {
logger.debug("Prepaidplace"); logger.debug("Prepaidplace");
placebean.lockPlaceProduct(shoppingUser, prodentry.getKey(), BigDecimal.ONE); placebean.lockPlaceProduct(shoppingUser, prodentry.getKey(), BigDecimal.ONE);
} }
ac.setSeller(seller);
shoppingUser.getAccountEvents().add(ac);
} }
logger.debug("ShopCash price {}", tot); logger.debug("ShopCash price {}", tot);
......
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal; import java.util.ArrayList;
import java.math.RoundingMode;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -23,20 +22,22 @@ import fi.insomnia.bortal.bortal.views.BillSummary; ...@@ -23,20 +22,22 @@ import fi.insomnia.bortal.bortal.views.BillSummary;
import fi.insomnia.bortal.enums.apps.BillPermission; import fi.insomnia.bortal.enums.apps.BillPermission;
import fi.insomnia.bortal.facade.BillFacade; import fi.insomnia.bortal.facade.BillFacade;
import fi.insomnia.bortal.facade.BillLineFacade; import fi.insomnia.bortal.facade.BillLineFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.AccountEvent; import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Bill; import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine; import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.Discount;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product; import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.utilities.I18n;
/** /**
* Session Bean implementation class BillBean * Session Bean implementation class BillBean
*/ */
@Stateless @Stateless
@LocalBean @LocalBean
@DeclareRoles({ "BILL/READ", "USER_MANAGEMENT/EXECUTE", "USER_MANAGEMENT/READ" }) @DeclareRoles({ "USER", "BILL/WRITE_ALL", "BILL/READ_ALL", "BILL/CREATE_BILL" })
public class BillBean implements BillBeanLocal { public class BillBean implements BillBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(BillBean.class); private static final Logger logger = LoggerFactory.getLogger(BillBean.class);
...@@ -60,6 +61,10 @@ public class BillBean implements BillBeanLocal { ...@@ -60,6 +61,10 @@ public class BillBean implements BillBeanLocal {
@EJB @EJB
private PermissionBeanLocal permissionbean; private PermissionBeanLocal permissionbean;
@EJB
private UserFacade userfacade;
@EJB
private UtilBean utilbean;
/** /**
* Default constructor. * Default constructor.
...@@ -69,7 +74,8 @@ public class BillBean implements BillBeanLocal { ...@@ -69,7 +74,8 @@ public class BillBean implements BillBeanLocal {
} }
@Override @Override
public Bill findById(int id) throws PermissionDeniedException { @RolesAllowed("USER")
public Bill findById(int id) {
LanEvent event = eventbean.getCurrentEvent(); LanEvent event = eventbean.getCurrentEvent();
if (id <= 0) { if (id <= 0) {
return null; return null;
...@@ -78,9 +84,8 @@ public class BillBean implements BillBeanLocal { ...@@ -78,9 +84,8 @@ public class BillBean implements BillBeanLocal {
User currentuser = permbean.getCurrentUser(); User currentuser = permbean.getCurrentUser();
logger.debug("bill {} user {}", bill, currentuser); logger.debug("bill {} user {}", bill, currentuser);
if (bill == null || !currentuser.equals(bill.getUser())) { if (bill != null && !currentuser.equals(bill.getUser()) && !permbean.hasPermission(BillPermission.READ_ALL)) {
bill = null; bill = null;
permbean.fatalPermission(BillPermission.READ_ALL, "No right to read bill: ", bill);
} }
return bill; return bill;
...@@ -112,62 +117,75 @@ public class BillBean implements BillBeanLocal { ...@@ -112,62 +117,75 @@ public class BillBean implements BillBeanLocal {
} }
@Override // @Override
public Bill createEmptyBill(User shoppingUser) throws PermissionDeniedException { // public Bill createEmptyBill(User shoppingUser) throws
if (permbean.isCurrentUser(shoppingUser)) { // PermissionDeniedException {
permbean.fatalPermission(BillPermission.CREATE_BILL, "No permission to create empty bill for self"); // if (permbean.isCurrentUser(shoppingUser)) {
} else { // permbean.fatalPermission(BillPermission.CREATE_BILL,
permbean.fatalPermission(BillPermission.WRITE_ALL, "Trying to create bill to someone else without sufficient permission"); // "No permission to create empty bill for self");
} // } else {
// permbean.fatalPermission(BillPermission.WRITE_ALL,
LanEvent event = eventbean.getCurrentEvent(); // "Trying to create bill to someone else without sufficient permission");
Bill ret = new Bill(event, shoppingUser); // }
billFacade.create(ret); //
ret.setUser(shoppingUser); // LanEvent event = eventbean.getCurrentEvent();
em.flush(); // Bill ret = new Bill(event, shoppingUser);
logger.debug("Created bill with id {} and user {}", ret.getId(), ret.getUser()); // billFacade.create(ret);
return ret; // ret.setUser(shoppingUser);
} // em.flush();
// logger.debug("Created bill with id {} and user {}", ret.getId(),
// ret.getUser());
// return ret;
// }
// @Override
// @RolesAllowed("SHOP/EXECUTE")
// public BillLine addProductToBill(Bill bill, Product product, BigDecimal
// count) throws PermissionDeniedException {
//
// // If bill number > 0 bill has been sent and extra privileges are needed
// // to modify.
// boolean iscurrent = permissionbean.isCurrentUser(bill.getUser());
// Integer billnr = bill.getBillNumber();
// if (!iscurrent || billnr != null) {
// permbean.fatalPermission(BillPermission.WRITE_ALL,
// "User tried to modify bill ", bill, "without sufficient permissions");
// }
// BillLine line = new BillLine(bill, product.getName(),
// product.getUnitName(), count, product.getPrice(), product.getVat());
// line.setLineProduct(product);
// billLineFacade.create(line);
//
// List<Discount> discounts = productBean.getActiveDiscounts(product,
// count);
//
// for (Discount disc : discounts) {
// BigDecimal unitPrice =
// product.getPrice().subtract(product.getPrice().multiply(disc.getPercentage())).negate().setScale(2,
// RoundingMode.HALF_UP);
// BigDecimal vatPrice =
// product.getVat().subtract(product.getVat().multiply(disc.getPercentage())).negate().setScale(2,
// RoundingMode.HALF_UP);
//
// BillLine discountLine = new BillLine(bill, disc.getShortdesc(),
// product.getUnitName(), count, unitPrice, vatPrice);
// billLineFacade.create(discountLine);
//
// }
//
// em.flush();
// return line;
// }
@Override @Override
@RolesAllowed("SHOP/EXECUTE") @RolesAllowed("BILL/READ_ALL")
public BillLine addProductToBill(Bill bill, Product product, BigDecimal count) throws PermissionDeniedException {
// If bill number > 0 bill has been sent and extra privileges are needed
// to modify.
boolean iscurrent = permissionbean.isCurrentUser(bill.getUser());
Integer billnr = bill.getBillNumber();
if (!iscurrent || billnr != null) {
permbean.fatalPermission(BillPermission.WRITE_ALL, "User tried to modify bill ", bill, "without sufficient permissions");
}
BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat());
line.setLineProduct(product);
billLineFacade.create(line);
List<Discount> discounts = productBean.getActiveDiscounts(product, count);
for (Discount disc : discounts) {
BigDecimal unitPrice = product.getPrice().subtract(product.getPrice().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP);
BigDecimal vatPrice = product.getVat().subtract(product.getVat().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP);
BillLine discountLine = new BillLine(bill, disc.getShortdesc(), product.getUnitName(), count, unitPrice, vatPrice);
billLineFacade.create(discountLine);
}
em.flush();
return line;
}
@Override
@RolesAllowed("BILL/WRITE")
public List<Bill> findAll() { public List<Bill> findAll() {
return billFacade.findAll(eventbean.getCurrentEvent()); return billFacade.findAll(eventbean.getCurrentEvent());
} }
@Override @Override
@RolesAllowed("BILL/READ") @RolesAllowed("BILL/READ_ALL")
public Collection<BillSummary> getBillLineSummary() { public Collection<BillSummary> getBillLineSummary() {
Collection<BillSummary> ret = billLineFacade.getLineSummary(eventbean.getCurrentEvent()); Collection<BillSummary> ret = billLineFacade.getLineSummary(eventbean.getCurrentEvent());
...@@ -175,7 +193,7 @@ public class BillBean implements BillBeanLocal { ...@@ -175,7 +193,7 @@ public class BillBean implements BillBeanLocal {
} }
@Override @Override
@RolesAllowed("BILL/WRITE") @RolesAllowed("BILL/WRITE_ALL")
public void markPaid(Bill bill, Calendar when) { public void markPaid(Bill bill, Calendar when) {
Product creditproduct = productBean.findCreditProduct(); Product creditproduct = productBean.findCreditProduct();
...@@ -189,7 +207,7 @@ public class BillBean implements BillBeanLocal { ...@@ -189,7 +207,7 @@ public class BillBean implements BillBeanLocal {
bill.setAccountEvent(ac); bill.setAccountEvent(ac);
bill.setPaidDate(when); bill.setPaidDate(when);
billFacade.merge(bill); bill = billFacade.merge(bill);
for (BillLine bl : bill.getBillLines()) { for (BillLine bl : bill.getBillLines()) {
Product prod = bl.getLineProduct(); Product prod = bl.getLineProduct();
...@@ -205,6 +223,24 @@ public class BillBean implements BillBeanLocal { ...@@ -205,6 +223,24 @@ 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());
utilbean.sendMail(msg);
}
@Override
@RolesAllowed("BILL/CREATE_BILL")
public void createBill(Bill bill) throws PermissionDeniedException {
if (!permbean.isCurrentUser(bill.getUser())) {
permbean.fatalPermission(BillPermission.WRITE_ALL, "Not enought rights to create bill for user ", bill.getUser());
}
User user = userfacade.find(bill.getUser().getId());
if (user.getBills() == null) {
user.setBills(new ArrayList<Bill>());
}
user.getBills().add(bill);
} }
} }
...@@ -5,15 +5,19 @@ import javax.annotation.security.RolesAllowed; ...@@ -5,15 +5,19 @@ import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.EventMapFacade; import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
/** /**
* Session Bean implementation class EventMapBean * Session Bean implementation class EventMapBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "MAP/WRITE" }) @DeclareRoles({ "MAP/MANAGE_MAPS" })
public class EventMapBean implements EventMapBeanLocal { public class EventMapBean implements EventMapBeanLocal {
@EJB @EJB
...@@ -22,15 +26,17 @@ public class EventMapBean implements EventMapBeanLocal { ...@@ -22,15 +26,17 @@ public class EventMapBean implements EventMapBeanLocal {
@EJB @EJB
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
private static final Logger logger = LoggerFactory.getLogger(EventMapBean.class);
@Override @Override
@RolesAllowed("MAP/WRITE") @RolesAllowed("MAP/MANAGE_MAPS")
public EventMap saveMap(EventMap eventmap) { public EventMap saveMap(EventMap eventmap) {
return eventmapfacade.merge(eventmap); return eventmapfacade.merge(eventmap);
} }
@Override @Override
@RolesAllowed("MAP/WRITE") @RolesAllowed("MAP/MANAGE_MAPS")
public EventMap create(String mapname) throws PermissionDeniedException { public EventMap create(String mapname) throws PermissionDeniedException {
EventMap ret = new EventMap(eventbean.getCurrentEvent()); EventMap ret = new EventMap(eventbean.getCurrentEvent());
ret.setName(mapname); ret.setName(mapname);
...@@ -42,13 +48,20 @@ public class EventMapBean implements EventMapBeanLocal { ...@@ -42,13 +48,20 @@ public class EventMapBean implements EventMapBeanLocal {
} }
@Override @Override
@RolesAllowed("MAP/WRITE") @RolesAllowed("MAP/MANAGE_MAPS")
public void sendImage(int destId, byte[] imagedata) { public void sendImage(int destId, byte[] imagedata) {
LanEvent event = eventbean.getCurrentEvent(); LanEvent event = eventbean.getCurrentEvent();
EventMap map = eventmapfacade.find(event.getId(), destId); EventMap map = eventmapfacade.find(event, destId);
logger.debug("Setting mapdata for map {}", map);
if (map != null) { if (map != null) {
map.setMapData(imagedata); map.setMapData(imagedata);
} }
} }
@Override
@RolesAllowed("MAP/MANAGE_MAPS")
public EventMap find(Integer mapId) {
return eventmapfacade.find(new EventPk(eventbean.getCurrentEvent(), mapId));
}
} }
...@@ -2,6 +2,8 @@ package fi.insomnia.bortal.beans; ...@@ -2,6 +2,8 @@ package fi.insomnia.bortal.beans;
import java.util.List; import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
...@@ -12,6 +14,7 @@ import fi.insomnia.bortal.model.EventOrganiser; ...@@ -12,6 +14,7 @@ import fi.insomnia.bortal.model.EventOrganiser;
* Session Bean implementation class EventOrganiserBean * Session Bean implementation class EventOrganiserBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "SUPERADMIN" })
public class EventOrganiserBean implements EventOrganiserBeanLocal { public class EventOrganiserBean implements EventOrganiserBeanLocal {
@EJB @EJB
...@@ -30,27 +33,18 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal { ...@@ -30,27 +33,18 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal {
} }
@Override @Override
public void save(EventOrganiser eventorg) throws PermissionDeniedException { public void save(EventOrganiser eventorg) {
fatalPermission(eventorg);
eventorgfacade.merge(eventorg); eventorgfacade.merge(eventorg);
} }
@Override @Override
public void fatalPermission(EventOrganiser eventorg) throws PermissionDeniedException { @RolesAllowed("SUPERADMIN")
if (!permbean.isCurrentUser(eventorg.getAdmin()) && !permbean.getCurrentUser().isSuperadmin()) { public List<EventOrganiser> getEventOrganisers() {
throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "Someone other than admin tried to access EventOrganiser: " + eventorg.toString());
}
}
@Override
public List<EventOrganiser> getEventOrganisers() throws PermissionDeniedException {
if (!permbean.getCurrentUser().isSuperadmin()) {
throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "Non-superadmin tried to list all EventOrganisers");
}
return eventorgfacade.findAll(); return eventorgfacade.findAll();
} }
@Override @Override
@RolesAllowed("SUPERADMIN")
public EventOrganiser create(String name) { public EventOrganiser create(String name) {
EventOrganiser ret = new EventOrganiser(); EventOrganiser ret = new EventOrganiser();
ret.setAdmin(permbean.getCurrentUser()); ret.setAdmin(permbean.getCurrentUser());
...@@ -58,4 +52,10 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal { ...@@ -58,4 +52,10 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal {
eventorgfacade.create(ret); eventorgfacade.create(ret);
return ret; return ret;
} }
@Override
@RolesAllowed("SUPERADMIN")
public EventOrganiser find(Integer orgId) {
return eventorgfacade.find(orgId);
}
} }
...@@ -16,6 +16,7 @@ import fi.insomnia.bortal.enums.BortalApplication; ...@@ -16,6 +16,7 @@ import fi.insomnia.bortal.enums.BortalApplication;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.ApplicationPermission; import fi.insomnia.bortal.model.ApplicationPermission;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
...@@ -36,14 +37,18 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote { ...@@ -36,14 +37,18 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
private UserBean userbean; private UserBean userbean;
@EJB @EJB
private PermissionBeanLocal permbean; private PermissionBeanLocal permbean;
@EJB
private EventBeanLocal eventbean;
public User tryLogin(String username, String password) { public User tryLogin(String username, String password) {
User user = userfacade.findByLogin(username.trim()); User user = userfacade.findByLogin(username.trim());
logger.debug("Trying to login as {}", username);
User ret = null; User ret = null;
if (user != null) { if (user != null) {
if (user.checkPassword(password)) { if (user.isAnonymous()) {
logger.info("logging in as anonymous!!!");
ret = user;
} else if (user.checkPassword(password)) {
ret = user; ret = user;
} else { } else {
secubean.logMessage(SecurityLogType.permissionDenied, user, "Login failed: wrong password for username ", username); secubean.logMessage(SecurityLogType.permissionDenied, user, "Login failed: wrong password for username ", username);
...@@ -58,6 +63,7 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote { ...@@ -58,6 +63,7 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
@Override @Override
public boolean authenticate(String username, String password) { public boolean authenticate(String username, String password) {
logger.warn("Trying to login as {}", username);
boolean ret = (tryLogin(username, password) != null); boolean ret = (tryLogin(username, password) != null);
return ret; return ret;
...@@ -65,34 +71,42 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote { ...@@ -65,34 +71,42 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
@Override @Override
public Enumeration<String> getGroupNames(String user) { public Enumeration<String> getGroupNames(String user) {
logger.info("Fetching groupNames for user {}", user);
User usr = userbean.getUser(user); User usr = userbean.getUser(user);
HashSet<String> roleset = new HashSet<String>(); HashSet<String> roleset = new HashSet<String>();
if (usr != null) { if (usr == null) {
usr = permbean.getAnonUser();
if (permbean.isLoggedIn()) { }
roleset.add("USER"); if (usr != null && !usr.isAnonymous()) {
} roleset.add("USER");
// TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!! }
if (usr.isSuperadmin()) { // TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!!
for (BortalApplication app : BortalApplication.values()) { if (usr.isSuperadmin()) {
for (IAppPermission perm : app.getPermissions()) { for (BortalApplication app : BortalApplication.values()) {
roleset.add(perm.getFullName()); for (IAppPermission perm : app.getPermissions()) {
} roleset.add(perm.getFullName());
} }
roleset.add(BeanRole.SUPERADMIN.name()); }
} else { roleset.add(BeanRole.SUPERADMIN.name());
List<Role> usrroles = userbean.localFindUsersRoles(usr); } else {
for (Role role : usrroles) { List<Role> usrroles = userbean.localFindUsersRoles(usr);
for (ApplicationPermission apperm : role.getPermissions()) { for (Role role : usrroles) {
roleset.add(apperm.getPermission().getFullName()); for (ApplicationPermission apperm : role.getPermissions()) {
} roleset.add(apperm.getPermission().getFullName());
} }
}
LanEvent event = eventbean.getCurrentEvent();
if (event != null && !usr.isAnonymous() && event.getDefaultRole() != null) {
for (ApplicationPermission apperm : event.getDefaultRole().getPermissions()) {
roleset.add(apperm.getPermission().getFullName());
}
} }
} }
Vector<String> retvect = new Vector<String>(); Vector<String> retvect = new Vector<String>();
retvect.addAll(roleset); retvect.addAll(roleset);
logger.debug("group names for user {}: {}", user, retvect); logger.info("group names for user {}: {}", user, retvect);
return retvect.elements(); return retvect.elements();
} }
......
...@@ -11,22 +11,44 @@ import javax.ejb.Stateless; ...@@ -11,22 +11,44 @@ import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.apps.BillPermission;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
@Stateless @Stateless
@DeclareRoles({ "ANONYMOUS", "SUPERADMIN", "USER", "LOGIN/READ", "LOGIN/WRITE", @DeclareRoles({
"LOGIN/EXECUTE", "USER_MANAGEMENT/READ", "USER_MANAGEMENT/WRITE", UserPermission.S_CREATE_NEW,
"USER_MANAGEMENT/EXECUTE", "ACCOUNT_MANAGEMENT/READ", UserPermission.S_LOGIN,
"ACCOUNT_MANAGEMENT/WRITE", "ACCOUNT_MANAGEMENT/EXECUTE", "BILL/READ", UserPermission.S_LOGOUT,
"BILL/WRITE", "BILL/EXECUTE", "MAP/READ", "MAP/WRITE", "MAP/EXECUTE", UserPermission.S_MODIFY,
"ROLE_MANAGEMENT/READ", "ROLE_MANAGEMENT/WRITE", "ROLE_MANAGEMENT/EXECUTE", UserPermission.S_MODIFY_ACCOUNTEVENTS,
"PRODUCT/READ", "PRODUCT/WRITE", "PRODUCT/EXECUTE", "SHOP/READ", UserPermission.S_READ_ROLES,
"SHOP/WRITE", "SHOP/EXECUTE", "GAME/READ", "GAME/WRITE", "GAME/EXECUTE", UserPermission.S_VIEW_ACCOUNTEVENTS,
"POLL/READ", "POLL/WRITE", "POLL/EXECUTE" }) UserPermission.S_VIEW_ALL,
UserPermission.S_VIEW_SELF,
UserPermission.S_WRITE_ROLES,
MapPermission.S_VIEW,
MapPermission.S_MANAGE_MAPS,
MapPermission.S_MANAGE_OTHERS,
MapPermission.S_BUY_PLACES,
ShopPermission.S_LIST_ALL_PRODUCTS,
ShopPermission.S_LIST_USERPRODUCTS,
ShopPermission.S_SHOP_TO_OTHERS,
ShopPermission.S_MANAGE_PRODUCTS,
ShopPermission.S_SHOP_PRODUCTS,
BillPermission.S_CREATE_BILL,
BillPermission.S_READ_ALL,
BillPermission.S_WRITE_ALL,
"ANONYMOUS", "SUPERADMIN", "USER" })
public class PermissionBean implements PermissionBeanLocal { public class PermissionBean implements PermissionBeanLocal {
public static final String DEFAULT_USER_LOGIN = "anonymous";
private static final Logger logger = LoggerFactory.getLogger(PermissionBean.class); private static final Logger logger = LoggerFactory.getLogger(PermissionBean.class);
...@@ -53,54 +75,10 @@ public class PermissionBean implements PermissionBeanLocal { ...@@ -53,54 +75,10 @@ public class PermissionBean implements PermissionBeanLocal {
return getCurrentUser().isSuperadmin() return getCurrentUser().isSuperadmin()
|| context.isCallerInRole(perm.getFullName()); || context.isCallerInRole(perm.getFullName());
// User user = getCurrentUser();
//
// Boolean ret = BortalLocalContextHolder.hasPermission(target,
// permission);
// // Boolean ret = BortalLocalContextHolder.hasPermission(target,
// // permission);
// if (ret == null) {
// try {
// for (Role role : userbean.findUsersRoles(user)) {
// if (role == null) {
// continue;
// }
//
// for (RoleRight rr : role.getRoleRights()) {
// BortalLocalContextHolder.setPermission(rr);
//
// ret = BortalLocalContextHolder.hasPermission(target, permission);
// if (ret != null) {
// break;
// }
//
// }
// if (ret != null) {
// break;
// }
// }
// } catch (PermissionDeniedException e) {
// logger.warn("Permission denied when it should be allowed!!", e);
// }
// }
//
// // TODO: FIX THIS!! really bad idea....
//
// if (user.isSuperadmin()) {
// return true;
// }
//
// if (ret == null) {
// ret = false;
// BortalLocalContextHolder.setPermission(target, permission, ret);
// }
//
// return ret;
} }
@Override @Override
public void fatalPermission(IAppPermission permission, Object... failmessage) throws PermissionDeniedException { public boolean fatalPermission(IAppPermission permission, Object... failmessage) throws PermissionDeniedException {
boolean ret = hasPermission(permission); boolean ret = hasPermission(permission);
if (!ret) { if (!ret) {
StringBuilder message = new StringBuilder().append(" permission: ").append(permission); StringBuilder message = new StringBuilder().append(" permission: ").append(permission);
...@@ -116,6 +94,7 @@ public class PermissionBean implements PermissionBeanLocal { ...@@ -116,6 +94,7 @@ public class PermissionBean implements PermissionBeanLocal {
throw new PermissionDeniedException(loggingbean, getCurrentUser(), message.toString()); throw new PermissionDeniedException(loggingbean, getCurrentUser(), message.toString());
} }
return true;
} }
@Override @Override
...@@ -133,8 +112,6 @@ public class PermissionBean implements PermissionBeanLocal { ...@@ -133,8 +112,6 @@ public class PermissionBean implements PermissionBeanLocal {
@Override @Override
public boolean isLoggedIn() { public boolean isLoggedIn() {
logger.info("Anonuser {}, currentuser {}", getAnonUser(), getCurrentUser());
logger.info("Is current superadmin {}", getCurrentUser().isSuperadmin());
return !getAnonUser().equals(getCurrentUser()) || getCurrentUser().isSuperadmin(); return !getAnonUser().equals(getCurrentUser()) || getCurrentUser().isSuperadmin();
} }
...@@ -155,14 +132,14 @@ public class PermissionBean implements PermissionBeanLocal { ...@@ -155,14 +132,14 @@ public class PermissionBean implements PermissionBeanLocal {
*/ */
@Override @Override
public User getAnonUser() { public User getAnonUser() {
User defaultUser = userfacade.findByLogin(DEFAULT_USER_LOGIN); User defaultUser = userfacade.findByLogin(User.ANONYMOUS_LOGINNAME);
if (defaultUser == null) { if (defaultUser == null) {
defaultUser = new User(); defaultUser = new User();
defaultUser.setLogin(DEFAULT_USER_LOGIN); defaultUser.setLogin(User.ANONYMOUS_LOGINNAME);
defaultUser.setNick(DEFAULT_USER_LOGIN); defaultUser.setNick(User.ANONYMOUS_LOGINNAME);
userfacade.create(defaultUser); userfacade.create(defaultUser);
defaultUser.setSuperadmin(true); // defaultUser.setSuperadmin(true);
} }
return defaultUser; return defaultUser;
} }
......
...@@ -47,7 +47,9 @@ import fi.insomnia.bortal.model.User; ...@@ -47,7 +47,9 @@ import fi.insomnia.bortal.model.User;
*/ */
@Stateless @Stateless
@LocalBean @LocalBean
@DeclareRoles({ "MAP/READ", "MAP/WRITE", "MAP/EXECUTE", "SHOP/EXECUTE" }) @DeclareRoles({ MapPermission.S_BUY_PLACES,
"MAP/BUY_PLACES",
MapPermission.S_MANAGE_MAPS })
public class PlaceBean implements PlaceBeanLocal { public class PlaceBean implements PlaceBeanLocal {
private static final String PLACE_RESERVE_TIMEOUTER = "Map reserve timeouter"; private static final String PLACE_RESERVE_TIMEOUTER = "Map reserve timeouter";
private static final Logger logger = LoggerFactory.getLogger(PlaceBean.class); private static final Logger logger = LoggerFactory.getLogger(PlaceBean.class);
...@@ -75,7 +77,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -75,7 +77,7 @@ public class PlaceBean implements PlaceBeanLocal {
private UserFacade userfacade; private UserFacade userfacade;
@Override @Override
@RolesAllowed("MAP/WRITE") @RolesAllowed(MapPermission.S_MANAGE_MAPS)
public Place mergeChanges(Place place) { public Place mergeChanges(Place place) {
return placeFacade.merge(place); return placeFacade.merge(place);
} }
...@@ -144,7 +146,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -144,7 +146,7 @@ public class PlaceBean implements PlaceBeanLocal {
public Place findPlace(EventMap e, int x, int y) { public Place findPlace(EventMap e, int x, int y) {
for (Place place : e.getPlaces()) { for (Place place : e.getPlaces()) {
if (place.isCoordinateInPlace(x, y)) { if (place.isCoordinateInPlace(x, y)) {
return place; return placeFacade.find(place.getId());
} }
} }
return null; return null;
...@@ -160,9 +162,10 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -160,9 +162,10 @@ public class PlaceBean implements PlaceBeanLocal {
* @return true when successfull. On any error false. * @return true when successfull. On any error false.
*/ */
@Override @Override
@RolesAllowed("MAP/EXECUTE") @RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean reservePlace(Place place, User user) { public boolean reservePlace(Place place, User user) {
place = placeFacade.find(place.getId()); place = placeFacade.find(place.getId());
user = userfacade.find(user.getId());
boolean ret = false; boolean ret = false;
if (place.isBuyable() && !place.isTaken()) { if (place.isBuyable() && !place.isTaken()) {
place.setCurrentUser(user); place.setCurrentUser(user);
...@@ -204,49 +207,57 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -204,49 +207,57 @@ public class PlaceBean implements PlaceBeanLocal {
} }
@Override @Override
@RolesAllowed("MAP/EXECUTE") @RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean buySelectedPlaces(User user) throws BortalCatchableException, PermissionDeniedException { public PlaceGroup buySelectedPlaces(User user) throws BortalCatchableException, PermissionDeniedException {
permbean.fatalPermission(MapPermission.BUY_PLACES, "No rights to buy places from map");
if (user == null) { if (user == null) {
user = permbean.getCurrentUser(); user = permbean.getCurrentUser();
} else if (!user.equals(permbean.getCurrentUser())) { } else {
permbean.fatalPermission(MapPermission.MANAGE_OTHERS, "Can not buy places for user ", user); if (!user.equals(permbean.getCurrentUser())) {
permbean.fatalPermission(MapPermission.MANAGE_OTHERS, "Can not buy places for user ", user);
}
user = userfacade.find(user.getId()); user = userfacade.find(user.getId());
} }
LanEvent event = eventBean.getCurrentEvent(); LanEvent event = eventBean.getCurrentEvent();
List<Place> places = placeFacade.findUsersReservations(event, user); List<Place> places = placeFacade.findUsersReservations(event, user);
if (places.size() <= 0) { if (places.size() <= 0) {
return false; return null;
}
for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) {
productBean.createAccountEvent(line.getKey(), new BigDecimal(line.getValue()), user);
} }
// PlaceGroup pg = pgbean.createPlaceGroup(user); // PlaceGroup pg = pgbean.createPlaceGroup(user);
BigDecimal totalprice = totalReservationPrice(user, null); BigDecimal totalprice = totalReservationPrice(user, null);
BigDecimal balance = user.getAccountBalance(); BigDecimal balance = user.getAccountBalance();
if (balance.compareTo(totalprice) < 0) { if (balance.compareTo(totalprice) < 0) {
logger.debug("User {} Could not buy things because account balance is too low!", user); logger.debug("User {} Could not buy things because account balance is too low!", user);
return false; return null;
} }
PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true); PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
pg.setCreator(user); pg.setCreator(user);
user.getPlaceGroups().add(pg);
userfacade.flush();
for (Place p : places) { for (Place p : places) {
if (!p.isReservedFor(user)) { if (!p.isReservedFor(user)) {
throw new BortalCatchableException("Trying to buy place not reserved for that user"); throw new BortalCatchableException("Trying to buy place not reserved for that user");
} }
logger.info("Buying place {} for user {}", p.getName(), user.getLogin());
buy(p, pg, user); buy(p, pg, user);
} }
for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) { // adding account event does funny stuff. evicting helps...
productBean.createAccountEvent(line.getKey(), new BigDecimal(line.getValue()), user); userfacade.evict(user);
}
user.getPlaceGroups().add(pg); return pg;
return true;
} }
// This method should not be available in the local bean client // This method should not be available in the local bean client
public void lockPlaceProduct(User user, Product prod, BigDecimal quantity) { void lockPlaceProduct(User user, Product prod, BigDecimal quantity) {
int loop = quantity.intValue(); int loop = quantity.intValue();
// BigDecimal loop = BigDecimal.ZERO; // BigDecimal loop = BigDecimal.ZERO;
...@@ -299,7 +310,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -299,7 +310,7 @@ public class PlaceBean implements PlaceBeanLocal {
} }
@Override @Override
@RolesAllowed("MAP/WRITE") @RolesAllowed(MapPermission.S_MANAGE_MAPS)
public int setBuyable(EventMap map, String like, boolean b) { public int setBuyable(EventMap map, String like, boolean b) {
return placeFacade.setBuyable(map, like, b); return placeFacade.setBuyable(map, like, b);
...@@ -385,7 +396,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -385,7 +396,7 @@ public class PlaceBean implements PlaceBeanLocal {
* @return true when successfull, on any erroro false. * @return true when successfull, on any erroro false.
*/ */
@Override @Override
@RolesAllowed("MAP/EXECUTE") @RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean releasePlace(Place place) { public boolean releasePlace(Place place) {
place = placeFacade.find(place.getId()); place = placeFacade.find(place.getId());
User user = permbean.getCurrentUser(); User user = permbean.getCurrentUser();
...@@ -400,13 +411,13 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -400,13 +411,13 @@ public class PlaceBean implements PlaceBeanLocal {
} }
@Override @Override
@RolesAllowed("MAP/EXECUTE") @RolesAllowed(MapPermission.S_MANAGE_MAPS)
public Place find(int placeId) { public Place find(int placeId) {
return placeFacade.find(eventBean.getCurrentEvent(), placeId); return placeFacade.find(eventBean.getCurrentEvent(), placeId);
} }
@Override @Override
@RolesAllowed("MAP/WRITE") @RolesAllowed(MapPermission.S_BUY_PLACES)
public void unbuyPlace(Place place) { public void unbuyPlace(Place place) {
place = placeFacade.find(place.getId()); place = placeFacade.find(place.getId());
if (place.getGroup() != null) { if (place.getGroup() != null) {
......
...@@ -81,8 +81,13 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -81,8 +81,13 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
} }
@Override @Override
@RolesAllowed("USER") @RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean associateToToken(User user, String token) { public boolean associateToToken(User user, String token) throws PermissionDeniedException {
if (!permbean.isCurrentUser(user)) {
permbean.fatalPermission(MapPermission.MANAGE_OTHERS);
}
token = token.trim(); token = token.trim();
GroupMembership mem = gmemfacade.findByToken(token); GroupMembership mem = gmemfacade.findByToken(token);
boolean ret = false; boolean ret = false;
......
...@@ -26,7 +26,7 @@ import fi.insomnia.bortal.model.PossibleAnswer; ...@@ -26,7 +26,7 @@ import fi.insomnia.bortal.model.PossibleAnswer;
*/ */
@Stateless @Stateless
@DeclareRoles("USER") @DeclareRoles({ "POLL/ANSWER", "POLL/VIEW_RESULTS", "POLL/CREATE" })
public class PollBean implements PollBeanLocal { public class PollBean implements PollBeanLocal {
@EJB @EJB
...@@ -57,7 +57,7 @@ public class PollBean implements PollBeanLocal { ...@@ -57,7 +57,7 @@ public class PollBean implements PollBeanLocal {
} }
@Override @Override
@RolesAllowed("USER") @RolesAllowed("POLL/ANSWER")
public List<Poll> findPolls() { public List<Poll> findPolls() {
List<Poll> list = new ArrayList<Poll>(); List<Poll> list = new ArrayList<Poll>();
...@@ -102,7 +102,7 @@ public class PollBean implements PollBeanLocal { ...@@ -102,7 +102,7 @@ public class PollBean implements PollBeanLocal {
} }
@Override @Override
@RolesAllowed("USER") @RolesAllowed("POLL/ANSWER")
public boolean createAnswers(List<PollAnswer> answers) { public boolean createAnswers(List<PollAnswer> answers) {
for (PollAnswer answer : answers) { for (PollAnswer answer : answers) {
...@@ -123,13 +123,21 @@ public class PollBean implements PollBeanLocal { ...@@ -123,13 +123,21 @@ public class PollBean implements PollBeanLocal {
} }
@Override @Override
@RolesAllowed("POLL/CREATE")
public void createPoll(Poll poll) { public void createPoll(Poll poll) {
pollFacade.create(poll); pollFacade.create(poll);
} }
@Override @Override
@RolesAllowed("POLL/ANSWER")
public void createAnswers(PollQuestion q) { public void createAnswers(PollQuestion q) {
pqfacade.create(q); pqfacade.create(q);
} }
@Override
@RolesAllowed("POLL/ANSWER")
public Poll find(Integer pollId) {
return pollFacade.find(eventBean.getCurrentEvent(), pollId);
}
} }
...@@ -2,7 +2,6 @@ package fi.insomnia.bortal.beans; ...@@ -2,7 +2,6 @@ package fi.insomnia.bortal.beans;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
...@@ -12,12 +11,14 @@ import javax.ejb.EJB; ...@@ -12,12 +11,14 @@ import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.facade.AccountEventFacade; import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.facade.DiscountFacade;
import fi.insomnia.bortal.facade.DiscountInstanceFacade; import fi.insomnia.bortal.facade.DiscountInstanceFacade;
import fi.insomnia.bortal.facade.ProductFacade; import fi.insomnia.bortal.facade.ProductFacade;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.AccountEvent; import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Discount; import fi.insomnia.bortal.model.Discount;
import fi.insomnia.bortal.model.DiscountInstance; import fi.insomnia.bortal.model.DiscountInstance;
import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.Product; import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
...@@ -25,7 +26,8 @@ import fi.insomnia.bortal.model.User; ...@@ -25,7 +26,8 @@ import fi.insomnia.bortal.model.User;
* Session Bean implementation class ProductBean * Session Bean implementation class ProductBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "PRODUCT/WRITE", "PRODUCT/READ", "SHOP/EXECUTE" }) @DeclareRoles({ "SHOP/LIST_USERPRODUCTS", "SHOP/LIST_ALL_PRODUCTS", "SHOP/LIST_USERPRODUCTS",
"SHOP/MANAGE_PRODUCTS" })
public class ProductBean implements ProductBeanLocal { public class ProductBean implements ProductBeanLocal {
private static final String DEFAULT_CREDIT_PRODCT = "Automagic Credit product"; private static final String DEFAULT_CREDIT_PRODCT = "Automagic Credit product";
...@@ -41,6 +43,8 @@ public class ProductBean implements ProductBeanLocal { ...@@ -41,6 +43,8 @@ public class ProductBean implements ProductBeanLocal {
@EJB @EJB
private DiscountInstanceFacade discountinstancefacade; private DiscountInstanceFacade discountinstancefacade;
@EJB @EJB
private DiscountFacade discountfacade;
@EJB
private UserFacade userFacade; private UserFacade userFacade;
@EJB @EJB
...@@ -54,40 +58,42 @@ public class ProductBean implements ProductBeanLocal { ...@@ -54,40 +58,42 @@ public class ProductBean implements ProductBeanLocal {
} }
@Override @Override
@RolesAllowed("SHOP/EXECUTE") @RolesAllowed("SHOP/LIST_USERPRODUCTS")
public List<Product> listUserShoppableProducts() { public List<Product> listUserShoppableProducts() {
return productFacade.findPrepaidProducts(eventBean.getCurrentEvent()); return productFacade.findPrepaidProducts(eventBean.getCurrentEvent());
} }
@Override @Override
@RolesAllowed("PRODUCT/WRITE") @RolesAllowed("SHOP/MANAGE_PRODUCTS")
public Product createProduct(String name, BigDecimal price) { public void create(Product prod) {
productFacade.create(prod);
Product entity = new Product(eventBean.getCurrentEvent(), name, price);
productFacade.create(entity);
return entity;
} }
@Override @Override
@RolesAllowed("PRODUCT/READ") @RolesAllowed("SHOP/LIST_ALL_PRODUCTS")
public List<Product> getProducts() { public List<Product> getProducts() {
return productFacade.findAll(eventBean.getCurrentEvent()); return productFacade.findAll(eventBean.getCurrentEvent());
} }
@Override @Override
@RolesAllowed("PRODUCT/WRITE") @RolesAllowed("SHOP/MANAGE_PRODUCTS")
public Product mergeChanges(Product product) { public Product mergeChanges(Product product) {
return productFacade.merge(product); return productFacade.merge(product);
} }
@Override @Override
public Product findCreditProduct() { public Product findCreditProduct() {
Product ret = productFacade.findProductByPrice(eventBean.getCurrentEvent(), BigDecimal.ONE.negate()); List<Product> ret = productFacade.findProductsByPrice(eventBean.getCurrentEvent(), BigDecimal.ONE.negate());
if (ret == null) { Product retProd = null;
ret = new Product(eventBean.getCurrentEvent(), DEFAULT_CREDIT_PRODCT, BigDecimal.ONE.negate()); if (ret == null || ret.isEmpty()) {
productFacade.create(ret); retProd = new Product(eventBean.getCurrentEvent());
retProd.setName(DEFAULT_CREDIT_PRODCT);
retProd.setPrice(BigDecimal.ONE.negate());
productFacade.create(retProd);
} else {
retProd = ret.get(0);
} }
return ret; return retProd;
} }
@Override @Override
...@@ -96,32 +102,35 @@ public class ProductBean implements ProductBeanLocal { ...@@ -96,32 +102,35 @@ public class ProductBean implements ProductBeanLocal {
throw new RuntimeException("Some parameter is null!"); throw new RuntimeException("Some parameter is null!");
} }
BigDecimal total = product.getPrice(); BigDecimal total = product.getPrice();
for (Discount d : getActiveDiscounts(product, quantity)) { for (Discount d : product.getActiveDiscounts(quantity)) {
total = total.multiply(d.getPercentage()); total = total.multiply(d.getPercentage());
} }
return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity); return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity);
} }
// TODO: alennukset lasketaan täällä. HUOMHUOM!! // // TODO: alennukset lasketaan täällä. HUOMHUOM!!
@Override // @Override
public List<Discount> getActiveDiscounts(Product product, BigDecimal quantity) { // public List<Discount> getActiveDiscounts(Product product, BigDecimal
ArrayList<Discount> ret = new ArrayList<Discount>(); // quantity) {
for (Discount d : product.getDiscounts()) { // ArrayList<Discount> ret = new ArrayList<Discount>();
if (d.isActive() && quantity.compareTo(d.getAmountMax()) <= 0 && quantity.compareTo(d.getAmountMin()) >= 0) { // for (Discount d : product.getDiscounts()) {
ret.add(d); // if (d.isActive() && quantity.compareTo(d.getAmountMax()) <= 0 &&
} // quantity.compareTo(d.getAmountMin()) >= 0) {
} // ret.add(d);
return ret; // }
} // }
// return ret;
// }
@Override @Override
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, User user) { public AccountEvent createAccountEvent(Product product, BigDecimal quantity, User user) {
BigDecimal unitPrice = product.getPrice().negate(); BigDecimal unitPrice = product.getPrice().negate();
List<Discount> discounts = getActiveDiscounts(product, quantity); List<Discount> discounts = product.getActiveDiscounts(quantity);
for (Discount d : discounts) { for (Discount d : discounts) {
unitPrice = unitPrice.multiply(d.getPercentage()); unitPrice = unitPrice.multiply(d.getPercentage());
} }
user = userFacade.find(user.getId()); user = userFacade.find(user.getId());
AccountEvent ret = new AccountEvent(eventBean.getCurrentEvent(), user, product, unitPrice, quantity, Calendar.getInstance()); AccountEvent ret = new AccountEvent(eventBean.getCurrentEvent(), user, product, unitPrice, quantity, Calendar.getInstance());
...@@ -147,9 +156,21 @@ public class ProductBean implements ProductBeanLocal { ...@@ -147,9 +156,21 @@ public class ProductBean implements ProductBeanLocal {
} }
@Override @Override
@RolesAllowed("SHOP/EXECUTE") @RolesAllowed("SHOP/LIST_ALL_PRODUCTS")
public List<Product> findForStaffshop() { public List<Product> findForStaffshop() {
return productFacade.findAll(eventBean.getCurrentEvent()); return productFacade.findAll(eventBean.getCurrentEvent());
} }
@RolesAllowed("SHOP/MANAGE_PRODUCTS")
@Override
public Discount findDiscount(Integer discountid) {
return discountfacade.find(new EventPk(eventBean.getCurrentEvent(), discountid));
}
@Override
@RolesAllowed("SHOP/MANAGE_PRODUCTS")
public Discount save(Discount discount) {
return discountfacade.merge(discount);
}
} }
...@@ -19,7 +19,9 @@ import javax.ejb.Stateless; ...@@ -19,7 +19,9 @@ import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.facade.RoleFacade; import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.model.ApplicationPermission;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
...@@ -28,7 +30,7 @@ import fi.insomnia.bortal.model.Role; ...@@ -28,7 +30,7 @@ import fi.insomnia.bortal.model.Role;
* @author tuukka * @author tuukka
*/ */
@Stateless @Stateless
@DeclareRoles({ "ROLE_MANAGEMENT/READ", "ROLE_MANAGEMENT/WRITE" }) @DeclareRoles({ "USER/READ_ROLES", "USER/WRITE_ROLES" })
public class RoleBean implements RoleBeanLocal { public class RoleBean implements RoleBeanLocal {
// private static final String PUBLIC_ROLE_NAME = // private static final String PUBLIC_ROLE_NAME =
...@@ -42,31 +44,30 @@ public class RoleBean implements RoleBeanLocal { ...@@ -42,31 +44,30 @@ public class RoleBean implements RoleBeanLocal {
private RoleFacade roleFacade; private RoleFacade roleFacade;
@Override @Override
@RolesAllowed("ROLE_MANAGEMENT/READ") @RolesAllowed("USER/READ_ROLES")
public List<Role> listRoles() { public List<Role> listRoles() {
return listRoles(eventBean.getCurrentEvent()); return listRoles(eventBean.getCurrentEvent());
} }
@RolesAllowed("ROLE_MANAGEMENT/READ") @RolesAllowed("USER/READ_ROLES")
public List<Role> listRoles(LanEvent event) { public List<Role> listRoles(LanEvent event) {
return roleFacade.findAll(event); return roleFacade.findAll(event);
} }
@Override @Override
@RolesAllowed("ROLE_MANAGEMENT/WRITE") @RolesAllowed("USER/WRITE_ROLES")
public Role mergeChanges(Role role) { public Role mergeChanges(Role role) {
return roleFacade.merge(role); return roleFacade.merge(role);
} }
@Override @Override
@RolesAllowed("ROLE_MANAGEMENT/WRITE") @RolesAllowed("USER/WRITE_ROLES")
public Role create(Role role) { public void create(Role role) {
roleFacade.create(role); roleFacade.create(role);
return role;
} }
@Override @Override
@RolesAllowed("ROLE_MANAGEMENT/READ") @RolesAllowed("USER/READ_ROLES")
public List<Role> getPossibleParents(Role role) { public List<Role> getPossibleParents(Role role) {
List<Role> roleList = listRoles(); List<Role> roleList = listRoles();
...@@ -132,9 +133,37 @@ public class RoleBean implements RoleBeanLocal { ...@@ -132,9 +133,37 @@ public class RoleBean implements RoleBeanLocal {
// } // }
@Override @Override
@RolesAllowed("ROLE_MANAGEMENT/READ")
public Role find(int id) { public Role find(int id) {
return roleFacade.find(id); return roleFacade.find(id);
} }
@Override
@RolesAllowed("USER/WRITE_ROLES")
public Role setPermissions(Role role, List<IAppPermission> newPerms) {
role = roleFacade.find(role.getId());
List<ApplicationPermission> permissions = role.getPermissions();
HashSet<ApplicationPermission> rmlist = new HashSet<ApplicationPermission>();
for (ApplicationPermission appPerm : permissions) {
// If role contains permission not in parameter newPerms remove
// it.
if (!newPerms.contains(appPerm.getPermission())) {
rmlist.add(appPerm);
}
// remove handled permission from newPerms
newPerms.remove(appPerm.getPermission());
}
// Concurrent modification prevention!!
if (!rmlist.isEmpty()) {
permissions.removeAll(rmlist);
}
// Add permissions not existing in role
for (IAppPermission perm : newPerms) {
permissions.add(new ApplicationPermission(role, perm));
}
roleFacade.flush();
return role;
}
} }
...@@ -3,7 +3,6 @@ package fi.insomnia.bortal.beans; ...@@ -3,7 +3,6 @@ package fi.insomnia.bortal.beans;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
...@@ -26,7 +25,6 @@ import fi.insomnia.bortal.facade.EventMapFacade; ...@@ -26,7 +25,6 @@ import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.facade.PlaceFacade; import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.Bill; import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.Compo; import fi.insomnia.bortal.model.Compo;
import fi.insomnia.bortal.model.CompoEntry; import fi.insomnia.bortal.model.CompoEntry;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
...@@ -151,53 +149,56 @@ public class TestDataBean implements TestDataBeanLocal { ...@@ -151,53 +149,56 @@ public class TestDataBean implements TestDataBeanLocal {
return u; return u;
} }
@Override // @Override
public Bill createBill(User u) { // public Bill createBill(User u) {
Bill b = new Bill(eventBean.getCurrentEvent()); // Bill b = new Bill(eventBean.getCurrentEvent());
b.setUser(u); // b.setUser(u);
b.setAddr1("Kalle Kävijä"); // b.setAddr1("Kalle Kävijä");
b.setAddr2("co / Pelivieroitus Ry"); // b.setAddr2("co / Pelivieroitus Ry");
b.setAddr3("Pallokorvankatu 1"); // b.setAddr3("Pallokorvankatu 1");
b.setAddr4("696969 Keikyä"); // b.setAddr4("696969 Keikyä");
b.setAddr5("FINLAND! \\o/"); // b.setAddr5("FINLAND! \\o/");
b.setBillNumber(123123); // b.setBillNumber(123123);
b.setDelayIntrest(11); // b.setDelayIntrest(11);
b.setDeliveryTerms("Toimitetaan, ehkä..."); // b.setDeliveryTerms("Toimitetaan, ehkä...");
Calendar duedate = Calendar.getInstance(); // Calendar duedate = Calendar.getInstance();
duedate.add(Calendar.DATE, 14); // duedate.add(Calendar.DATE, 14);
b.setNotes("Some notes..."); // b.setNotes("Some notes...");
b.setNoticetime("14 vrk"); // b.setNoticetime("14 vrk");
b.setOurReference("Meitin viite ( Insomnia XII )"); // b.setOurReference("Meitin viite ( Insomnia XII )");
b.setPaymentTime(14); // b.setPaymentTime(14);
b.setSentDate(Calendar.getInstance()); // b.setSentDate(Calendar.getInstance());
b.setTheirReference("Niitten viite ( tyhjä? )"); // b.setTheirReference("Niitten viite ( tyhjä? )");
billFacade.create(b); // billFacade.create(b);
createBillLine(b, "Tuote1", 1239.3, "kpl", 11.0, 0.22); // createBillLine(b, "Tuote1", 1239.3, "kpl", 11.0, 0.22);
createBillLine(b, "Tuote2", 0.3, "pss", 11.0, 0.22); // createBillLine(b, "Tuote2", 0.3, "pss", 11.0, 0.22);
createBillLine(b, "Tuote3", 9.3, "l", 11.0, 0.22); // createBillLine(b, "Tuote3", 9.3, "l", 11.0, 0.22);
createBillLine(b, "Tuote4", 9, "kWh", 99931911.0, 0); // createBillLine(b, "Tuote4", 9, "kWh", 99931911.0, 0);
createBillLine(b, "Tuote5", 33, "mol", 11.0, 0.22); // createBillLine(b, "Tuote5", 33, "mol", 11.0, 0.22);
createBillLine(b, "Tuote6", 39939.23123123, "rad", 122.0, 0.18); // createBillLine(b, "Tuote6", 39939.23123123, "rad", 122.0, 0.18);
//
return b; // return b;
} // }
private BillLine createBillLine(Bill b, String line, double d, String qname, double e, double f) {
return createBillLine(b, line, new BigDecimal(d), qname, new BigDecimal(e), new BigDecimal(f));
}
private BillLine createBillLine(Bill b, String line, BigDecimal q, String qname, BigDecimal price, BigDecimal vat) {
BillLine bl = new BillLine(b);
bl.setName(line);
bl.setQuantity(q);
bl.setUnitName(qname);
bl.setUnitPrice(price);
bl.setVat(vat);
billLineFacade.create(bl); // private BillLine createBillLine(Bill b, String line, double d, String
return bl; // qname, double e, double f) {
} // return createBillLine(b, line, new BigDecimal(d), qname, new
// BigDecimal(e), new BigDecimal(f));
//
// }
// private BillLine createBillLine(Bill b, String line, BigDecimal q, String
// qname, BigDecimal price, BigDecimal vat) {
// BillLine bl = new BillLine(b);
// bl.setName(line);
// bl.setQuantity(q);
// bl.setUnitName(qname);
// bl.setUnitPrice(price);
// bl.setVat(vat);
//
// billLineFacade.create(bl);
// return bl;
// }
@Override @Override
public EventMap generateTestMap() { public EventMap generateTestMap() {
...@@ -298,4 +299,10 @@ public class TestDataBean implements TestDataBeanLocal { ...@@ -298,4 +299,10 @@ public class TestDataBean implements TestDataBeanLocal {
q.executeUpdate(); q.executeUpdate();
} }
@Override
public Bill createBill(User u) {
// TODO Auto-generated method stub
return null;
}
} }
...@@ -31,13 +31,14 @@ import fi.insomnia.bortal.model.UserImage; ...@@ -31,13 +31,14 @@ import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage; import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.utilities.I18n; import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.utilities.PasswordFunctions; import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.utilities.SearchResult;
/** /**
* Session Bean implementation class UserBean * Session Bean implementation class UserBean
*/ */
@LocalBean @LocalBean
@Stateless @Stateless
@DeclareRoles({ "USER/EXECUTE" }) @DeclareRoles({ "USER/EXECUTE", "USER/VIEW_ALL", "USER" })
public class UserBean implements UserBeanLocal { public class UserBean implements UserBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(UserBean.class); private static final Logger logger = LoggerFactory.getLogger(UserBean.class);
...@@ -74,7 +75,7 @@ public class UserBean implements UserBeanLocal { ...@@ -74,7 +75,7 @@ public class UserBean implements UserBeanLocal {
private GroupMembershipFacade gmfacade; private GroupMembershipFacade gmfacade;
@Override @Override
@RolesAllowed("USER_MANAGEMENT/READ") @RolesAllowed("USER/VIEW_ALL")
public List<User> getUsers() { public List<User> getUsers() {
List<User> ret = userFacade.findAll(); List<User> ret = userFacade.findAll();
...@@ -192,10 +193,10 @@ public class UserBean implements UserBeanLocal { ...@@ -192,10 +193,10 @@ public class UserBean implements UserBeanLocal {
return ret; return ret;
} }
@Override // @Override
public List<User> searchName(String name) { // public List<User> searchName(String name) {
return userFacade.searchForName(name); // return userFacade.searchForName(name);
} // }
@Override @Override
public User createNewUser(User user, String password) { public User createNewUser(User user, String password) {
...@@ -233,21 +234,23 @@ public class UserBean implements UserBeanLocal { ...@@ -233,21 +234,23 @@ public class UserBean implements UserBeanLocal {
} }
@Override @Override
public boolean initPasswordReset(User user, String hash, String mailpath) { public User initPasswordReset(User user, String hash, String mailpath) {
logger.debug("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
if (hash == null || hash.length() < 20 || user == null || user.getEmail() == null || user.getEmail().length() <= 5) { if (hash == null || hash.length() < 20 || user == null || user.getEmail() == null || user.getEmail().length() <= 5) {
return false; logger.info("Not sending email with params {} {} {}", new Object[] { user, user.getEmail(), hash });
return null;
} }
logger.info("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
MailMessage msg = new MailMessage(); MailMessage msg = new MailMessage();
msg.setTo(user); msg.setTo(user);
msg.setSubject(I18n.get("passwordreset.mailSubject")); msg.setSubject(I18n.get("passwordreset.mailSubject"));
msg.setMessage(I18n.get("passwordreset.mailBody", mailpath)); msg.setMessage(I18n.get("passwordreset.mailBody", mailpath));
logger.info("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
utilbean.sendMail(msg); utilbean.sendMail(msg);
user = userFacade.find(user.getId());
user.setConfirmHash(hash); user.setConfirmHash(hash);
userFacade.merge(user); return user;
return true;
} }
...@@ -257,14 +260,14 @@ public class UserBean implements UserBeanLocal { ...@@ -257,14 +260,14 @@ public class UserBean implements UserBeanLocal {
} }
@Override @Override
public List<User> getUsers(int page, int pagesize, String sort, String search) { public SearchResult<User> getUsers(int page, int pagesize, String sort, String search) {
return userFacade.searchUser(page, pagesize, sort, search); return userFacade.searchUser(page, pagesize, sort, search);
} }
@Override // @Override
public long getUsersCount(String search) { // public long getUsersCount(String search) {
return userFacade.searchUserCount(search); // return userFacade.searchUserCount(search);
} // }
@Override @Override
@RolesAllowed("USER/EXECUTE") @RolesAllowed("USER/EXECUTE")
...@@ -299,7 +302,6 @@ public class UserBean implements UserBeanLocal { ...@@ -299,7 +302,6 @@ public class UserBean implements UserBeanLocal {
gm.setInviteAccepted(Calendar.getInstance()); gm.setInviteAccepted(Calendar.getInstance());
userFacade.create(user); userFacade.create(user);
} }
} }
package fi.insomnia.bortal.beans;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.User;
/**
* Session Bean implementation class UserUtilBean
*/
@Stateless
// @TransactionManagement(TransactionManagementType.BEAN)
@LocalBean
public class UserUtilBean implements UserUtilBeanLocal {
/**
* Default constructor.
*/
public UserUtilBean() {
// TODO Auto-generated constructor stub
}
@EJB
private UserBeanLocal userbean;
private static final Logger logger = LoggerFactory.getLogger(UserUtilBean.class);
@EJB
private UserFacade userfacade;
@Override
public void convertUsernames() {
for (User u : userbean.getUsers()) {
if (u.getLogin().trim().isEmpty()) {
logger.warn("User {} has empty login...");
continue;
}
User testU = userfacade.findByLogin(u.getLogin().toLowerCase());
if (testU == null || testU.equals(u)) {
u.setLogin(u.getLogin().toLowerCase());
logger.info("Converted user {}", u.getLogin());
} else {
logger.warn("Could not convert user {}", u.getLogin(), testU.getLogin());
}
}
}
}
...@@ -11,6 +11,8 @@ import java.math.RoundingMode; ...@@ -11,6 +11,8 @@ import java.math.RoundingMode;
import java.util.Date; import java.util.Date;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
...@@ -34,6 +36,7 @@ import fi.insomnia.bortal.util.MailMessage; ...@@ -34,6 +36,7 @@ import fi.insomnia.bortal.util.MailMessage;
*/ */
@Stateless @Stateless
@LocalBean @LocalBean
@DeclareRoles("SUPERADMIN")
public class UtilBean implements UtilBeanLocal { public class UtilBean implements UtilBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(UtilBean.class); private static final Logger logger = LoggerFactory.getLogger(UtilBean.class);
...@@ -57,6 +60,7 @@ public class UtilBean implements UtilBeanLocal { ...@@ -57,6 +60,7 @@ public class UtilBean implements UtilBeanLocal {
@Override @Override
public boolean sendMail(MailMessage message) { public boolean sendMail(MailMessage message) {
logger.info("Sending mail message {} ", message);
Date d = new Date(); Date d = new Date();
try { try {
QueueConnection conn = mailQuefactory.createQueueConnection(); QueueConnection conn = mailQuefactory.createQueueConnection();
...@@ -66,13 +70,14 @@ public class UtilBean implements UtilBeanLocal { ...@@ -66,13 +70,14 @@ public class UtilBean implements UtilBeanLocal {
session.createProducer(mailQueue).send(objmessage); session.createProducer(mailQueue).send(objmessage);
conn.close(); conn.close();
} catch (JMSException e) { } catch (JMSException e) {
logger.debug("Got exception sending mail", e); logger.warn("Got exception sending mail", e);
} }
logger.debug("Message time {}", new Date().getTime() - d.getTime()); logger.debug("Message time {}", new Date().getTime() - d.getTime());
return true; return true;
} }
@Override @Override
@RolesAllowed("SUPERADMIN")
public void checkAllUsersImages() throws PermissionDeniedException { public void checkAllUsersImages() throws PermissionDeniedException {
for (User usr : userbean.getUsers()) { for (User usr : userbean.getUsers()) {
...@@ -137,4 +142,5 @@ public class UtilBean implements UtilBeanLocal { ...@@ -137,4 +142,5 @@ public class UtilBean implements UtilBeanLocal {
} }
return true; return true;
} }
} }
...@@ -10,6 +10,7 @@ import org.slf4j.Logger; ...@@ -10,6 +10,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.EventPk; import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.EventPk_;
import fi.insomnia.bortal.model.GenericEventChild; import fi.insomnia.bortal.model.GenericEventChild;
import fi.insomnia.bortal.model.GenericEventChild_; import fi.insomnia.bortal.model.GenericEventChild_;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
...@@ -41,7 +42,8 @@ public abstract class EventChildGenericFacade<T extends GenericEventChild> exten ...@@ -41,7 +42,8 @@ public abstract class EventChildGenericFacade<T extends GenericEventChild> exten
Root<T> root = cq.from(getEntityClass()); Root<T> root = cq.from(getEntityClass());
cq.where(cb.equal(root.get(GenericEventChild_.event), event)); cq.where(cb.equal(root.get(GenericEventChild_.event), event));
cq.orderBy(cb.asc(root.get(GenericEventChild_.id)));
cq.orderBy(cb.asc(root.get(GenericEventChild_.id).get(EventPk_.id)));
return getEm().createQuery(cq).getResultList(); return getEm().createQuery(cq).getResultList();
} }
......
...@@ -4,46 +4,57 @@ import javax.ejb.LocalBean; ...@@ -4,46 +4,57 @@ import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LanEvent_;
@Stateless @Stateless
@LocalBean @LocalBean
public class EventFacade extends GenericFacade<Integer, LanEvent> { public class EventFacade extends GenericFacade<Integer, LanEvent> {
// private static final Logger logger = LoggerFactory.getLogger(EventFacade.class); // private static final Logger logger =
@PersistenceContext // LoggerFactory.getLogger(EventFacade.class);
private EntityManager em; @PersistenceContext
private EntityManager em;
public EventFacade() {
super(LanEvent.class);
}
public EventFacade() { @Override
super(LanEvent.class); protected EntityManager getEm() {
} return em;
}
protected EntityManager getEm() { public LanEvent findByHostname(String hostname) {
return em;
}
public LanEvent findByHostname(String hostname) { CriteriaBuilder cb = em.getCriteriaBuilder();
TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByReferer", LanEvent.class); CriteriaQuery<LanEvent> cq = cb.createQuery(LanEvent.class);
q.setParameter("referer", hostname); Root<LanEvent> root = cq.from(LanEvent.class);
return getSingleNullableResult(q); cq.where(cb.equal(root.get(LanEvent_.eventEnabled), true));
} // TypedQuery<LanEvent> q =
// em.createNamedQuery("LanEvent.findByReferer", LanEvent.class);
// q.setParameter("referer", hostname);
return getSingleNullableResult(em.createQuery(cq));
public LanEvent findByName(String name) { }
// TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByName", LanEvent.class);
// q.setParameter("name", name);
// return getSingleNullableResult(q);
return this.find(1);
}
public String flushCache() { public LanEvent findByName(String name) {
getEm().getEntityManagerFactory().getCache().evictAll(); // TypedQuery<LanEvent> q = em.createNamedQuery("LanEvent.findByName",
return "Evicted all!"; // LanEvent.class);
// q.setParameter("name", name);
} // return getSingleNullableResult(q);
return this.find(1);
}
public String flushCache() {
getEm().getEntityManagerFactory().getCache().evictAll();
return "Evicted all!";
}
} }
...@@ -13,26 +13,27 @@ import javax.persistence.criteria.CriteriaQuery; ...@@ -13,26 +13,27 @@ import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path; import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.iki.tuomari.utils.beans.callbacks.FacadeCallback; import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.iki.tuomari.utils.jpa.IntegerModelInterface;
import fi.insomnia.bortal.utilities.SearchResult; import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.jpa.ModelInterface; import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public abstract class GenericFacade<I extends Serializable, C extends ModelInterface<I>> { public abstract class GenericFacade<I extends Serializable, C extends ModelInterface<I>> {
protected static <T, C extends IntegerModelInterface> List<SingularAttribute<C, T>> mkAttrlist(SingularAttribute<C, T>... types) { // protected static <T, C extends ModelInterface<T>>
List<SingularAttribute<C, T>> ret = new ArrayList<SingularAttribute<C, T>>(); // List<SingularAttribute<C, T>> mkAttrlist(SingularAttribute<C, T>...
for (SingularAttribute<C, T> a : types) { // types) {
ret.add(a); // List<SingularAttribute<C, T>> ret = new ArrayList<SingularAttribute<C,
} // T>>();
return Collections.unmodifiableList(ret); // for (SingularAttribute<C, T> a : types) {
// ret.add(a);
} // }
// return Collections.unmodifiableList(ret);
//
// }
private final Class<C> entClass; private final Class<C> entClass;
private static final Logger logger = LoggerFactory.getLogger(GenericFacade.class); private static final Logger logger = LoggerFactory.getLogger(GenericFacade.class);
...@@ -61,6 +62,10 @@ public abstract class GenericFacade<I extends Serializable, C extends ModelInter ...@@ -61,6 +62,10 @@ public abstract class GenericFacade<I extends Serializable, C extends ModelInter
} }
public void refresh(C usr) {
getEm().refresh(usr);
}
public C find(I id) { public C find(I id) {
if (id == null) { if (id == null) {
return null; return null;
...@@ -267,4 +272,7 @@ public abstract class GenericFacade<I extends Serializable, C extends ModelInter ...@@ -267,4 +272,7 @@ public abstract class GenericFacade<I extends Serializable, C extends ModelInter
getEm().flush(); getEm().flush();
} }
public void evict(C clz) {
getEm().getEntityManagerFactory().getCache().evict(getEntityClass(), clz.getId());
}
} }
...@@ -156,6 +156,9 @@ public class PlaceFacade extends EventChildGenericFacade<Place> { ...@@ -156,6 +156,9 @@ public class PlaceFacade extends EventChildGenericFacade<Place> {
} }
public int setBuyable(EventMap map, String like, boolean b) { public int setBuyable(EventMap map, String like, boolean b) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Place> cq = cb.createQuery(Place.class);
Root<Place> root = cq.from(Place.class);
Query q = em.createQuery("UPDATE Place p set p.buyable = :b where p.name like :like"); Query q = em.createQuery("UPDATE Place p set p.buyable = :b where p.name like :like");
q.setParameter("b", b); q.setParameter("b", b);
......
...@@ -8,48 +8,49 @@ import javax.ejb.Stateless; ...@@ -8,48 +8,49 @@ import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product; import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Product_;
import fi.insomnia.bortal.model.User;
@Stateless @Stateless
@LocalBean @LocalBean
public class ProductFacade extends EventChildGenericFacade<Product> { public class ProductFacade extends EventChildGenericFacade<Product> {
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
public ProductFacade() { public ProductFacade() {
super(Product.class); super(Product.class);
} }
protected EntityManager getEm() { @Override
return em; protected EntityManager getEm() {
} return em;
}
public Product getCreditProduct() {
throw new RuntimeException(); public Product getCreditProduct() {
} throw new RuntimeException();
}
public Product findProductByPrice(LanEvent event, BigDecimal price) {
// EventPk id = new EventPk(event); public List<Product> findProductsByPrice(LanEvent event, BigDecimal price) {
TypedQuery<Product> q = em.createQuery("select p from Product p where p.id.eventId = :eventid and p.price = :price", Product.class); CriteriaBuilder cb = em.getCriteriaBuilder();
q.setParameter("price", price); CriteriaQuery<Product> cq = cb.createQuery(Product.class);
q.setParameter("eventid", event.getId()); Root<Product> root = cq.from(Product.class);
List<Product> results = q.getResultList(); cq.where(cb.equal(root.get(Product_.event), event),
if (results.size() > 0) { cb.equal(root.get(Product_.price), price));
return results.get(0);
} return em.createQuery(cq).getResultList();
return null; }
}
public List<Product> findPrepaidProducts(LanEvent e) {
public List<Product> findPrepaidProducts(LanEvent e) { TypedQuery<Product> q = em.createQuery("select p from Product p where p.id.eventId = :eventid and p.prepaid = true", Product.class);
TypedQuery<Product> q = em.createQuery("select p from Product p where p.id.eventId = :eventid and p.prepaid = true", Product.class); q.setParameter("eventid", e.getId());
q.setParameter("eventid", e.getId()); return q.getResultList();
return q.getResultList(); }
}
} }
...@@ -6,10 +6,13 @@ import javax.ejb.LocalBean; ...@@ -6,10 +6,13 @@ import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.Role_;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
@Stateless @Stateless
...@@ -28,18 +31,21 @@ public class RoleFacade extends GenericFacade<Integer, Role> { ...@@ -28,18 +31,21 @@ public class RoleFacade extends GenericFacade<Integer, Role> {
return em; return em;
} }
public Role findByName(String name, LanEvent event) { // public Role findByName(String name, LanEvent event) {
TypedQuery<Role> q = em.createNamedQuery("Role.findByRoleName", Role.class); // TypedQuery<Role> q = em.createNamedQuery("Role.findByRoleName",
q.setParameter("name", name); // Role.class);
q.setParameter("event", event); // q.setParameter("name", name);
return getSingleNullableResult(q); // q.setParameter("event", event);
} // return getSingleNullableResult(q);
// }
public List<Role> findForUser(User user, LanEvent event) { public List<Role> findForUser(User user, LanEvent event) {
TypedQuery<Role> q = getEm().createNamedQuery("Role.findForUser", Role.class); CriteriaBuilder cb = em.getCriteriaBuilder();
q.setParameter("user", user); CriteriaQuery<Role> cq = cb.createQuery(Role.class);
q.setParameter("event", event); Root<Role> root = cq.from(Role.class);
return q.getResultList(); cq.where(cb.equal(root.get(Role_.event), event), cb.isMember(user, root.get(Role_.users)));
return em.createQuery(cq).getResultList();
} }
public Role createRole(LanEvent event, String rolename) { public Role createRole(LanEvent event, String rolename) {
...@@ -50,9 +56,12 @@ public class RoleFacade extends GenericFacade<Integer, Role> { ...@@ -50,9 +56,12 @@ public class RoleFacade extends GenericFacade<Integer, Role> {
} }
public List<Role> findAll(LanEvent event) { public List<Role> findAll(LanEvent event) {
TypedQuery<Role> q = getEm().createNamedQuery("Role.findForEvent", Role.class); CriteriaBuilder cb = em.getCriteriaBuilder();
q.setParameter("event", event); CriteriaQuery<Role> cq = cb.createQuery(Role.class);
return q.getResultList(); Root<Role> root = cq.from(Role.class);
cq.where(cb.equal(root.get(Role_.event), event));
return em.createQuery(cq).getResultList();
} }
} }
...@@ -6,12 +6,20 @@ import javax.ejb.LocalBean; ...@@ -6,12 +6,20 @@ import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.callbacks.OrderCallback;
import fi.insomnia.bortal.facade.callbacks.StringPredicateField;
import fi.insomnia.bortal.facade.callbacks.StringSearchPredicateCreator;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.User_;
import fi.insomnia.bortal.utilities.SearchResult;
@Stateless @Stateless
@LocalBean @LocalBean
...@@ -19,10 +27,28 @@ public class UserFacade extends GenericFacade<Integer, User> { ...@@ -19,10 +27,28 @@ public class UserFacade extends GenericFacade<Integer, User> {
private static final Logger logger = LoggerFactory.getLogger(UserFacade.class); private static final Logger logger = LoggerFactory.getLogger(UserFacade.class);
public enum UserField { private enum Userfields implements StringPredicateField<User> {
id, nick, login, firstname, lastname nick(User_.nick), login(User_.login), firstnames(User_.firstnames), lastname(User_.lastname), email(User_.email);
private SingularAttribute<User, String> field;
Userfields(SingularAttribute<User, String> f) {
field = f;
}
@Override
public SingularAttribute<User, String> getField() {
return field;
}
} }
// final String[] NAMEFIELDS = { "nick", "login", "firstnames", "lastname",
// "email" };
//
// public enum UserField {
// id, nick, login, firstname, lastname
// }
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
...@@ -36,24 +62,28 @@ public class UserFacade extends GenericFacade<Integer, User> { ...@@ -36,24 +62,28 @@ public class UserFacade extends GenericFacade<Integer, User> {
} }
/** /**
* Find user by username. Username is converted to lowercase before * Find user by username.
* searching.
* *
* @param login * @param login
* @return * @return
*/ */
public User findByLogin(String login) { public User findByLogin(String login) {
TypedQuery<User> q = em.createNamedQuery("User.findByLogin", User.class); CriteriaBuilder cb = em.getCriteriaBuilder();
q.setParameter("login", login.toLowerCase()); CriteriaQuery<User> cq = cb.createQuery(User.class);
return getSingleNullableResult(q); Root<User> root = cq.from(User.class);
} cq.where(cb.equal(root.get(User_.login), login));
private static final String[] NAMEFIELDS = { "nick", "login", "firstnames", "lastname", "email" };
public List<User> searchForName(String name) { return getSingleNullableResult(em.createQuery(cq));
return this.search(name, NAMEFIELDS, "login");
} }
// public SearchResult<User> searchForName(String name) {
// return super.searcher(0, 0,
// new StringSearchPredicateCreator<User>(name, Userfields.values()),
// new OrderCallback<User>(true, User_.login)
// );
// // return this.search(name, NAMEFIELDS, "login");
// }
@Override @Override
public void create(User user) { public void create(User user) {
user.setLogin(user.getLogin().toLowerCase().trim()); user.setLogin(user.getLogin().toLowerCase().trim());
...@@ -66,29 +96,36 @@ public class UserFacade extends GenericFacade<Integer, User> { ...@@ -66,29 +96,36 @@ public class UserFacade extends GenericFacade<Integer, User> {
return super.merge(user); return super.merge(user);
} }
public List<User> searchUser(int page, int pagesize, String sort, String search) { public SearchResult<User> searchUser(int page, int pagesize, String sort, String search) {
String query = null;
if (sort == null || sort.isEmpty()) { if (sort == null || sort.isEmpty()) {
sort = "nick"; sort = "nick";
} }
if (search != null) {
query = new StringBuilder().append("%").append(search).append('%').toString();
}
return this.search(page, pagesize, query, NAMEFIELDS, sort);
}
public long searchUserCount(String search) { return super.searcher(page, pagesize,
String query = null; new StringSearchPredicateCreator<User>(search, Userfields.values()),
if (search != null) { new OrderCallback<User>(true, sort)
query = new StringBuilder().append("%").append(search).append('%').toString(); );
}
return this.searchCount(query, NAMEFIELDS); // return this.search(page, pagesize, query, NAMEFIELDS, sort);
} }
// public long searchUserCount(String search) {
// String query = null;
// if (search != null) {
// query = new
// StringBuilder().append("%").append(search).append('%').toString();
// }
// return this.searchCount(query, NAMEFIELDS);
// }
public List<User> findByEmail(String email) { public List<User> findByEmail(String email) {
TypedQuery<User> q = em.createQuery("SELECT u from User u where u.email = :usr", User.class); CriteriaBuilder cb = em.getCriteriaBuilder();
q.setParameter("usr", email); CriteriaQuery<User> cq = cb.createQuery(User.class);
return q.getResultList(); Root<User> root = cq.from(User.class);
cq.where(cb.equal(root.get(User_.email), email));
return em.createQuery(cq).getResultList();
} }
} }
package fi.iki.tuomari.utils.beans.callbacks; package fi.insomnia.bortal.facade.callbacks;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
......
package fi.iki.tuomari.utils.beans.callbacks; package fi.insomnia.bortal.facade.callbacks;
import java.util.List; import java.util.List;
......
package fi.iki.tuomari.utils.beans.callbacks; package fi.insomnia.bortal.facade.callbacks;
import java.util.List; import java.util.List;
......
package fi.iki.tuomari.utils.beans.callbacks; package fi.insomnia.bortal.facade.callbacks;
import java.util.List; import java.util.List;
...@@ -31,9 +31,6 @@ public class OrderCallback<T extends ModelInterface<?>> implements FacadeCallbac ...@@ -31,9 +31,6 @@ public class OrderCallback<T extends ModelInterface<?>> implements FacadeCallbac
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
if (sort == null) {
return;
}
Expression<?> path = null; Expression<?> path = null;
if (sort == null) { if (sort == null) {
if (sortstr == null) { if (sortstr == null) {
...@@ -47,6 +44,7 @@ public class OrderCallback<T extends ModelInterface<?>> implements FacadeCallbac ...@@ -47,6 +44,7 @@ public class OrderCallback<T extends ModelInterface<?>> implements FacadeCallbac
} else { } else {
path = root.get(sort); path = root.get(sort);
} }
if (path == null) { if (path == null) {
return; return;
} }
......
package fi.insomnia.bortal.facade.callbacks;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public interface StringPredicateField<T extends ModelInterface<?>> {
SingularAttribute<T, String> getField();
}
package fi.iki.tuomari.utils.beans.callbacks; package fi.insomnia.bortal.facade.callbacks;
import java.util.Collections;
import java.util.List; import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
...@@ -14,17 +13,25 @@ import fi.insomnia.bortal.utilities.jpa.ModelInterface; ...@@ -14,17 +13,25 @@ import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public class StringSearchPredicateCreator<T extends ModelInterface<?>> implements FacadeCallback<T> { public class StringSearchPredicateCreator<T extends ModelInterface<?>> implements FacadeCallback<T> {
private static final String WILDCARD = "%"; private static final String WILDCARD = "%";
private String searchstr = null; private String searchstr = null;
private List<SingularAttribute<T, String>> attributes = null; private StringPredicateField<T>[] attributes = null;
private SingularAttribute<T, String> attr;
public StringSearchPredicateCreator(String search, List<SingularAttribute<T, String>> attrs) { // public StringSearchPredicateCreator(String search,
// List<SingularAttribute<T, String>> attrs) {
// if (addSearch(search)) {
// attributes = attrs.;
// }
// }
public StringSearchPredicateCreator(String search, SingularAttribute<T, String> from) {
if (addSearch(search)) { if (addSearch(search)) {
attributes = attrs; from = attr;
} }
} }
public StringSearchPredicateCreator(String search, SingularAttribute<T, String> from) { public StringSearchPredicateCreator(String name, StringPredicateField<T>[] values) {
if (addSearch(search)) { if (addSearch(name)) {
attributes = Collections.singletonList(from); attributes = values;
} }
} }
...@@ -43,14 +50,18 @@ public class StringSearchPredicateCreator<T extends ModelInterface<?>> implement ...@@ -43,14 +50,18 @@ public class StringSearchPredicateCreator<T extends ModelInterface<?>> implement
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) { if (searchstr == null || (attr == null && (attributes == null || attributes.length == 0))) {
return; return;
} }
Predicate[] preds = new Predicate[attributes.size()]; if (attr == null) {
int i = 0; predicates.add(cb.equal(root.get(attr), searchstr));
for (SingularAttribute<T, String> attr : attributes) { } else {
preds[i++] = cb.equal(root.get(attr), searchstr); Predicate[] preds = new Predicate[attributes.length];
int i = 0;
for (StringPredicateField<T> attr : attributes) {
preds[i++] = cb.equal(root.get(attr.getField()), searchstr);
}
predicates.add(cb.and(preds));
} }
predicates.add(cb.and(preds));
} }
} }
...@@ -23,6 +23,7 @@ public interface AccountEventBeanLocal { ...@@ -23,6 +23,7 @@ public interface AccountEventBeanLocal {
List<Role> getRolesFromAccountEvents(User u); List<Role> getRolesFromAccountEvents(User u);
List<AccountEvent> shopCash(User shoppingUser, Map<Product, BigDecimal> shopMap, boolean buyInstant) throws PermissionDeniedException; List<AccountEvent> shopCash(User shoppingUser, Map<Product, BigDecimal>
shopMap, boolean buyInstant) throws PermissionDeniedException;
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -10,18 +9,17 @@ import javax.ejb.Local; ...@@ -10,18 +9,17 @@ import javax.ejb.Local;
import fi.insomnia.bortal.bortal.views.BillSummary; import fi.insomnia.bortal.bortal.views.BillSummary;
import fi.insomnia.bortal.model.Bill; import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.User;
@Local @Local
public interface BillBeanLocal { public interface BillBeanLocal {
Bill findById(int id) throws PermissionDeniedException; Bill findById(int id) throws PermissionDeniedException;
Bill createEmptyBill(User shoppingUser) throws PermissionDeniedException; //
// Bill createEmptyBill(User shoppingUser) throws PermissionDeniedException;
BillLine addProductToBill(Bill bill, Product product, BigDecimal count) throws PermissionDeniedException; //
// BillLine addProductToBill(Bill bill, Product product, BigDecimal count)
// throws PermissionDeniedException;
List<Bill> findAll(); List<Bill> findAll();
...@@ -31,4 +29,6 @@ public interface BillBeanLocal { ...@@ -31,4 +29,6 @@ public interface BillBeanLocal {
void getPdfBillStream(Bill bill, OutputStream ostream); void getPdfBillStream(Bill bill, OutputStream ostream);
void createBill(Bill bill) throws PermissionDeniedException;
} }
...@@ -13,4 +13,6 @@ public interface EventMapBeanLocal { ...@@ -13,4 +13,6 @@ public interface EventMapBeanLocal {
void sendImage(int destId, byte[] imagedata); void sendImage(int destId, byte[] imagedata);
EventMap find(Integer mapId);
} }
...@@ -11,10 +11,10 @@ public interface EventOrganiserBeanLocal { ...@@ -11,10 +11,10 @@ public interface EventOrganiserBeanLocal {
void save(EventOrganiser eventorg) throws PermissionDeniedException; void save(EventOrganiser eventorg) throws PermissionDeniedException;
void fatalPermission(EventOrganiser eventorg) throws PermissionDeniedException; List<EventOrganiser> getEventOrganisers();
List<EventOrganiser> getEventOrganisers() throws PermissionDeniedException;
EventOrganiser create(String createorgname); EventOrganiser create(String createorgname);
EventOrganiser find(Integer orgId);
} }
...@@ -7,6 +7,7 @@ import fi.insomnia.bortal.model.User; ...@@ -7,6 +7,7 @@ import fi.insomnia.bortal.model.User;
@Local @Local
public interface PermissionBeanLocal { public interface PermissionBeanLocal {
boolean hasPermission(IAppPermission perm); boolean hasPermission(IAppPermission perm);
User getCurrentUser(); User getCurrentUser();
...@@ -15,7 +16,7 @@ public interface PermissionBeanLocal { ...@@ -15,7 +16,7 @@ public interface PermissionBeanLocal {
boolean isCurrentUser(User thisuser); boolean isCurrentUser(User thisuser);
void fatalPermission(IAppPermission perm, Object... failmessage) throws PermissionDeniedException; boolean fatalPermission(IAppPermission perm, Object... failmessage) throws PermissionDeniedException;
void fatalNotLoggedIn() throws PermissionDeniedException; void fatalNotLoggedIn() throws PermissionDeniedException;
......
...@@ -12,6 +12,7 @@ import javax.ejb.Local; ...@@ -12,6 +12,7 @@ import javax.ejb.Local;
import fi.insomnia.bortal.exceptions.BortalCatchableException; import fi.insomnia.bortal.exceptions.BortalCatchableException;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.Place; import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
/** /**
...@@ -34,7 +35,7 @@ public interface PlaceBeanLocal { ...@@ -34,7 +35,7 @@ public interface PlaceBeanLocal {
Place mergeChanges(Place place); Place mergeChanges(Place place);
boolean buySelectedPlaces(User user) throws BortalCatchableException, PermissionDeniedException; PlaceGroup buySelectedPlaces(User user) throws BortalCatchableException, PermissionDeniedException;
BigDecimal totalReservationPrice(User user, Place newPlace) throws PermissionDeniedException; BigDecimal totalReservationPrice(User user, Place newPlace) throws PermissionDeniedException;
......
...@@ -17,7 +17,7 @@ public interface PlaceGroupBeanLocal { ...@@ -17,7 +17,7 @@ public interface PlaceGroupBeanLocal {
// List<GroupMembership> getMemberships(User user); // List<GroupMembership> getMemberships(User user);
boolean associateToToken(User user, String token); boolean associateToToken(User user, String token) throws PermissionDeniedException;
void releaseAndGenerateToken(GroupMembership gmem) throws PermissionDeniedException; void releaseAndGenerateToken(GroupMembership gmem) throws PermissionDeniedException;
......
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.List; import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
...@@ -11,18 +12,16 @@ import fi.insomnia.bortal.model.PossibleAnswer; ...@@ -11,18 +12,16 @@ import fi.insomnia.bortal.model.PossibleAnswer;
@Local @Local
public interface PollBeanLocal { public interface PollBeanLocal {
List<Poll> findPolls(); List<Poll> findPolls();
boolean createAnswers(List<PollAnswer> answers);
PossibleAnswer findPossibleAnwerById(int id); boolean createAnswers(List<PollAnswer> answers);
PossibleAnswer findPossibleAnwerById(int id);
void createPoll(Poll poll); void createPoll(Poll poll);
void createAnswers(PollQuestion q1);
void createAnswers(PollQuestion q1); Poll find(Integer pollId);
} }
...@@ -15,7 +15,7 @@ public interface ProductBeanLocal { ...@@ -15,7 +15,7 @@ public interface ProductBeanLocal {
List<Product> listUserShoppableProducts(); List<Product> listUserShoppableProducts();
Product createProduct(String name, BigDecimal price); void create(Product prod);
List<Product> getProducts(); List<Product> getProducts();
...@@ -27,10 +27,14 @@ public interface ProductBeanLocal { ...@@ -27,10 +27,14 @@ public interface ProductBeanLocal {
AccountEvent createAccountEvent(Product product, BigDecimal quantity, User user); AccountEvent createAccountEvent(Product product, BigDecimal quantity, User user);
List<Discount> getActiveDiscounts(Product product, BigDecimal quantity); // List<Discount> getActiveDiscounts(Product product, BigDecimal quantity);
Product findById(int parseInt); Product findById(int parseInt);
List<Product> findForStaffshop(); List<Product> findForStaffshop();
Discount findDiscount(Integer discountid);
Discount save(Discount discount);
} }
...@@ -9,6 +9,7 @@ import java.util.List; ...@@ -9,6 +9,7 @@ import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
/** /**
...@@ -22,10 +23,12 @@ public interface RoleBeanLocal { ...@@ -22,10 +23,12 @@ public interface RoleBeanLocal {
public Role mergeChanges(Role role); public Role mergeChanges(Role role);
public Role create(Role role); public void create(Role role);
public List<Role> getPossibleParents(Role role); public List<Role> getPossibleParents(Role role);
public Role find(int val); public Role find(int val);
public Role setPermissions(Role role, List<IAppPermission> newPerms);
} }
...@@ -8,15 +8,16 @@ import fi.insomnia.bortal.model.GroupMembership; ...@@ -8,15 +8,16 @@ import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage; import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.utilities.SearchResult;
@Local @Local
public interface UserBeanLocal { public interface UserBeanLocal {
List<User> getUsers(); List<User> getUsers();
List<User> getUsers(int page, int pagesize, String sort, String search); SearchResult<User> getUsers(int page, int pagesize, String sort, String search);
User getUser(String nick); User getUser(String login);
User mergeChanges(User currentUser) throws PermissionDeniedException; User mergeChanges(User currentUser) throws PermissionDeniedException;
...@@ -32,7 +33,7 @@ public interface UserBeanLocal { ...@@ -32,7 +33,7 @@ public interface UserBeanLocal {
UserImage findUserImage(int id) throws PermissionDeniedException; UserImage findUserImage(int id) throws PermissionDeniedException;
List<User> searchName(String name); // List<User> searchName(String name);
User createNewUser(User user, String password); User createNewUser(User user, String password);
...@@ -40,14 +41,12 @@ public interface UserBeanLocal { ...@@ -40,14 +41,12 @@ public interface UserBeanLocal {
boolean resetPassword(User user, String password, String hash); boolean resetPassword(User user, String password, String hash);
boolean initPasswordReset(User user, String hash, String mailpath); User initPasswordReset(User user, String hash, String mailpath);
List<Role> findUsersRoles(User u) throws PermissionDeniedException; List<Role> findUsersRoles(User u) throws PermissionDeniedException;
User findById(Integer integer); User findById(Integer integer);
long getUsersCount(String search);
boolean invite(String invitemail); boolean invite(String invitemail);
GroupMembership findToken(String token); GroupMembership findToken(String token);
......
package fi.insomnia.bortal.beans;
import javax.ejb.Local;
@Local
public interface UserUtilBeanLocal {
void convertUsernames();
}
...@@ -134,6 +134,7 @@ public class AccountEvent extends GenericEventChild { ...@@ -134,6 +134,7 @@ public class AccountEvent extends GenericEventChild {
public AccountEvent(LanEvent event, User u, Product prod, BigDecimal unitPrice, BigDecimal quantity, Calendar eventTime) { public AccountEvent(LanEvent event, User u, Product prod, BigDecimal unitPrice, BigDecimal quantity, Calendar eventTime) {
setId(new EventPk(event)); setId(new EventPk(event));
this.setEvent(event);
this.setUnitPrice(unitPrice); this.setUnitPrice(unitPrice);
this.setQuantity(quantity); this.setQuantity(quantity);
this.product = prod; this.product = prod;
......
...@@ -92,14 +92,15 @@ public class ApplicationPermission extends GenericEntity { ...@@ -92,14 +92,15 @@ public class ApplicationPermission extends GenericEntity {
public IAppPermission getPermission() { public IAppPermission getPermission() {
if (privatePerm == null && application != null && permission != null) { if (privatePerm == null && application != null && permission != null) {
for (IAppPermission appPerm : BortalApplication.valueOf(application).getPermissions()) { for (IAppPermission appPerm : getApplication().getPermissions()) {
if (appPerm.equals(permission)) { if (appPerm.toString().equals(permission)) {
privatePerm = appPerm; privatePerm = appPerm;
break; break;
} }
} }
} }
return privatePerm; return privatePerm;
} }
} }
...@@ -7,6 +7,7 @@ package fi.insomnia.bortal.model; ...@@ -7,6 +7,7 @@ package fi.insomnia.bortal.model;
import static javax.persistence.TemporalType.DATE; import static javax.persistence.TemporalType.DATE;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
...@@ -28,6 +29,8 @@ import javax.persistence.TemporalType; ...@@ -28,6 +29,8 @@ import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint; import javax.persistence.UniqueConstraint;
import org.eclipse.persistence.annotations.PrivateOwned; import org.eclipse.persistence.annotations.PrivateOwned;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* The system can send bills to the users. When user pays bill a AccountEvent * The system can send bills to the users. When user pays bill a AccountEvent
...@@ -133,13 +136,11 @@ public class Bill extends GenericEventChild { ...@@ -133,13 +136,11 @@ public class Bill extends GenericEventChild {
@ManyToOne(optional = false) @ManyToOne(optional = false)
private User user; private User user;
@ManyToOne private static final Logger logger = LoggerFactory.getLogger(Bill.class);
@JoinColumn(name = "event_id", referencedColumnName = "id", updatable = false, insertable = false)
private LanEvent event;
public Integer getReferenceNumberBase() { public Integer getReferenceNumberBase() {
if (event != null && event.getReferenceNumberBase() != null && billNumber != null) { if (getEvent() != null && getEvent().getReferenceNumberBase() != null && getBillNumber() != null) {
return event.getReferenceNumberBase() + billNumber; return getEvent().getReferenceNumberBase() + getBillNumber();
} }
return null; return null;
} }
...@@ -246,14 +247,6 @@ public class Bill extends GenericEventChild { ...@@ -246,14 +247,6 @@ public class Bill extends GenericEventChild {
this.user = usersId; this.user = usersId;
} }
public LanEvent getEvent() {
return event;
}
public void setBillNumber(Integer billNumber) {
this.billNumber = billNumber;
}
public Integer getBillNumber() { public Integer getBillNumber() {
return billNumber; return billNumber;
} }
...@@ -354,4 +347,29 @@ public class Bill extends GenericEventChild { ...@@ -354,4 +347,29 @@ public class Bill extends GenericEventChild {
return delayIntrest; return delayIntrest;
} }
public void addProduct(Product product, BigDecimal count) {
// If bill number > 0 bill has been sent and extra privileges are needed
// to modify.
// if (!iscurrent || billnr != null) {
// permbean.fatalPermission(BillPermission.WRITE_ALL,
// "User tried to modify bill ", bill,
// "without sufficient permissions");
// }
if (this.billLines == null) {
billLines = new ArrayList<BillLine>();
}
logger.info("Adding billine: {}", this.getEvent());
this.getBillLines().add(new BillLine(this, product, count));
logger.info("Adding billine2: {}", this.getEvent());
for (Discount disc : product.getActiveDiscounts(count)) {
this.getBillLines().add(new BillLine(this, product, disc, count));
}
}
public void setBillNumber(Integer billNumber) {
this.billNumber = billNumber;
}
} }
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
...@@ -109,20 +110,27 @@ public class BillLine extends GenericEventChild { ...@@ -109,20 +110,27 @@ public class BillLine extends GenericEventChild {
super(); super();
} }
public BillLine(Bill bill) { public BillLine(Bill bill2, Product product, BigDecimal count) {
super(); super(bill2.getEvent());
setId(new EventPk(bill.getId().getEventId())); this.bill = bill2;
this.bill = bill; this.lineProduct = product;
} this.name = product.getName();
this.setUnitName(product.getUnitName());
public BillLine(Bill bill, String product, String unitName, BigDecimal units, this.setQuantity(count);
BigDecimal unitPrice, BigDecimal vat) { this.setUnitPrice(product.getPrice());
this(bill); this.setVat(product.getVat());
this.unitName = unitName; }
this.name = product;
this.setQuantity(units); public BillLine(Bill bill2, Product product, Discount disc, BigDecimal count) {
this.setUnitPrice(unitPrice); super(bill2.getEvent());
this.setVat(vat); this.bill = bill2;
BigDecimal unitPrice = product.getPrice().subtract(product.getPrice().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP);
BigDecimal vatPrice = product.getVat().subtract(product.getVat().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP);
this.name = disc.getShortdesc();
this.unitName = product.getUnitName();
this.quantity = count;
this.unitPrice = unitPrice;
this.vat = vatPrice;
} }
public String getName() { public String getName() {
......
...@@ -11,9 +11,7 @@ import java.util.List; ...@@ -11,9 +11,7 @@ import java.util.List;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob; import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries; import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
...@@ -95,10 +93,6 @@ public class Compo extends GenericEventChild { ...@@ -95,10 +93,6 @@ public class Compo extends GenericEventChild {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "compo") @OneToMany(cascade = CascadeType.ALL, mappedBy = "compo")
private List<CompoEntry> compoEntries; private List<CompoEntry> compoEntries;
@ManyToOne
@JoinColumn(name = "event_id", referencedColumnName = "id", insertable = false, updatable = false)
private LanEvent event;
public Compo(LanEvent event, String compoName, boolean holdVoting) { public Compo(LanEvent event, String compoName, boolean holdVoting) {
this(event); this(event);
this.name = compoName; this.name = compoName;
...@@ -199,9 +193,4 @@ public class Compo extends GenericEventChild { ...@@ -199,9 +193,4 @@ public class Compo extends GenericEventChild {
public void setMaxParticipantCount(int maxParticipantCount) { public void setMaxParticipantCount(int maxParticipantCount) {
this.maxParticipantCount = maxParticipantCount; this.maxParticipantCount = maxParticipantCount;
} }
public LanEvent getEvent() {
return event;
}
} }
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
...@@ -81,6 +82,12 @@ public class Discount extends GenericEventChild { ...@@ -81,6 +82,12 @@ public class Discount extends GenericEventChild {
super(ev); super(ev);
} }
public Discount(Product product) {
this(product.getEvent());
this.products = new ArrayList<Product>();
products.add(product);
}
public BigDecimal getAmountMin() { public BigDecimal getAmountMin() {
return amountMin; return amountMin;
} }
......
...@@ -10,9 +10,7 @@ import java.util.List; ...@@ -10,9 +10,7 @@ import java.util.List;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob; import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries; import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
...@@ -44,9 +42,6 @@ public class EventMap extends GenericEventChild { ...@@ -44,9 +42,6 @@ public class EventMap extends GenericEventChild {
@OrderBy("name") @OrderBy("name")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "map") @OneToMany(cascade = CascadeType.ALL, mappedBy = "map")
private List<Place> places = new ArrayList<Place>(); private List<Place> places = new ArrayList<Place>();
@ManyToOne(optional = false)
@JoinColumn(name = "event_id", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)
private LanEvent event;
@OneToMany(mappedBy = "eventMap") @OneToMany(mappedBy = "eventMap")
private List<Reader> readers; private List<Reader> readers;
...@@ -97,10 +92,6 @@ public class EventMap extends GenericEventChild { ...@@ -97,10 +92,6 @@ public class EventMap extends GenericEventChild {
this.readers = readers; this.readers = readers;
} }
public LanEvent getEvent() {
return event;
}
public void setMapData(byte[] mapData) { public void setMapData(byte[] mapData) {
this.mapData = mapData; this.mapData = mapData;
} }
......
...@@ -34,6 +34,10 @@ public class EventPk implements Serializable { ...@@ -34,6 +34,10 @@ public class EventPk implements Serializable {
this.setEventId(event.getId()); this.setEventId(event.getId());
} }
public EventPk(LanEvent event, Integer id) {
this(event.getId(), id);
}
public EventPk(Integer eventId) { public EventPk(Integer eventId) {
super(); super();
this.setEventId(eventId); this.setEventId(eventId);
......
...@@ -28,6 +28,7 @@ public abstract class GenericEventChild extends EntityEquals implements ModelInt ...@@ -28,6 +28,7 @@ public abstract class GenericEventChild extends EntityEquals implements ModelInt
public GenericEventChild(LanEvent event) { public GenericEventChild(LanEvent event) {
id = new EventPk(event); id = new EventPk(event);
this.event = event;
} }
public GenericEventChild() { public GenericEventChild() {
...@@ -58,11 +59,11 @@ public abstract class GenericEventChild extends EntityEquals implements ModelInt ...@@ -58,11 +59,11 @@ public abstract class GenericEventChild extends EntityEquals implements ModelInt
this.jpaVersionField = jpaVersionField; this.jpaVersionField = jpaVersionField;
} }
public void setEvent(LanEvent event) { public final void setEvent(LanEvent event) {
this.event = event; this.event = event;
} }
public LanEvent getEvent() { public final LanEvent getEvent() {
return event; return event;
} }
......
...@@ -12,8 +12,6 @@ import javax.persistence.Column; ...@@ -12,8 +12,6 @@ import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.OneToOne; import javax.persistence.OneToOne;
import javax.persistence.Table; import javax.persistence.Table;
...@@ -25,12 +23,14 @@ import javax.persistence.TemporalType; ...@@ -25,12 +23,14 @@ import javax.persistence.TemporalType;
*/ */
@Entity @Entity
@Table(name = "events") @Table(name = "events")
@NamedQueries({ // @NamedQueries({
@NamedQuery(name = "LanEvent.findAll", query = "SELECT e FROM LanEvent e"), // @NamedQuery(name = "LanEvent.findAll", query = "SELECT e FROM LanEvent e"),
@NamedQuery(name = "LanEvent.findByStartTime", query = "SELECT e FROM LanEvent e WHERE e.startTime = :startTime"), // @NamedQuery(name = "LanEvent.findByStartTime", query =
@NamedQuery(name = "LanEvent.findByEndTime", query = "SELECT e FROM LanEvent e WHERE e.endTime = :endTime"), // "SELECT e FROM LanEvent e WHERE e.startTime = :startTime"),
@NamedQuery(name = "LanEvent.findByName", query = "SELECT e FROM LanEvent e WHERE e.name = :name"), // @NamedQuery(name = "LanEvent.findByEndTime", query =
@NamedQuery(name = "LanEvent.findByReferer", query = "SELECT e FROM LanEvent e WHERE e.referer = :referer") }) // "SELECT e FROM LanEvent e WHERE e.endTime = :endTime"),
// @NamedQuery(name = "LanEvent.findByName", query =
// "SELECT e FROM LanEvent e WHERE e.name = :name") })
public class LanEvent extends GenericEntity { public class LanEvent extends GenericEntity {
/** /**
...@@ -52,6 +52,9 @@ public class LanEvent extends GenericEntity { ...@@ -52,6 +52,9 @@ public class LanEvent extends GenericEntity {
@Column(name = "referer", unique = true, nullable = true) @Column(name = "referer", unique = true, nullable = true)
private String referer; private String referer;
@Column(nullable = false, name = "event_enabled")
private boolean eventEnabled = false;
/** /**
* Bill's reference number will be formed by adding this number to the bill * Bill's reference number will be formed by adding this number to the bill
* number and adding the checksum of that number as the last digit * number and adding the checksum of that number as the last digit
...@@ -237,4 +240,13 @@ public class LanEvent extends GenericEntity { ...@@ -237,4 +240,13 @@ public class LanEvent extends GenericEntity {
public int getNextBillNumber() { public int getNextBillNumber() {
return nextBillNumber; return nextBillNumber;
} }
public boolean isEventEnabled() {
return eventEnabled;
}
public void setEventEnabled(boolean eventEnabled) {
this.eventEnabled = eventEnabled;
}
} }
...@@ -70,7 +70,7 @@ public class Place extends GenericEventChild { ...@@ -70,7 +70,7 @@ public class Place extends GenericEventChild {
* Which group has bought the place * Which group has bought the place
*/ */
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "group_id", referencedColumnName = "id", nullable = false), @JoinColumn(name = "group_id", referencedColumnName = "id"),
@JoinColumn(name = "event_id", referencedColumnName = "event_id", nullable = false, updatable = false, insertable = false) }) @JoinColumn(name = "event_id", referencedColumnName = "event_id", nullable = false, updatable = false, insertable = false) })
@ManyToOne @ManyToOne
private PlaceGroup group; private PlaceGroup group;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
...@@ -39,7 +40,7 @@ public class Product extends GenericEventChild { ...@@ -39,7 +40,7 @@ public class Product extends GenericEventChild {
private String name; private String name;
@Column(name = "price", nullable = false, precision = 24, scale = 4) @Column(name = "price", nullable = false, precision = 24, scale = 4)
private BigDecimal price; private BigDecimal price = BigDecimal.ZERO;
@Column(name = "sort", nullable = false) @Column(name = "sort", nullable = false)
private int sort; private int sort;
...@@ -88,10 +89,8 @@ public class Product extends GenericEventChild { ...@@ -88,10 +89,8 @@ public class Product extends GenericEventChild {
super(); super();
} }
public Product(LanEvent event, String name, BigDecimal price) { public Product(LanEvent event) {
super(event); super(event);
this.price = price;
this.name = name;
} }
...@@ -115,6 +114,19 @@ public class Product extends GenericEventChild { ...@@ -115,6 +114,19 @@ public class Product extends GenericEventChild {
return tot; return tot;
} }
// TODO: alennukset lasketaan täällä. HUOMHUOM!!
public List<Discount> getActiveDiscounts(BigDecimal quantity) {
ArrayList<Discount> ret = new ArrayList<Discount>();
for (Discount d : getDiscounts()) {
if (d.isActive() &&
quantity.compareTo(d.getAmountMax()) <= 0 &&
quantity.compareTo(d.getAmountMin()) >= 0) {
ret.add(d);
}
}
return ret;
}
public String getName() { public String getName() {
return name; return name;
} }
......
...@@ -73,10 +73,6 @@ public class Reader extends GenericEventChild { ...@@ -73,10 +73,6 @@ public class Reader extends GenericEventChild {
@JoinColumn(name = "event_id", referencedColumnName = "event_id", updatable = false, insertable = false) }) @JoinColumn(name = "event_id", referencedColumnName = "event_id", updatable = false, insertable = false) })
private EventMap eventMap; private EventMap eventMap;
@ManyToOne
@JoinColumn(name = "event_id", referencedColumnName = "id", updatable = false, insertable = false)
private LanEvent event;
@Column(name = "map_x") @Column(name = "map_x")
private Integer mapX; private Integer mapX;
@Column(name = "map_y") @Column(name = "map_y")
...@@ -154,10 +150,6 @@ public class Reader extends GenericEventChild { ...@@ -154,10 +150,6 @@ public class Reader extends GenericEventChild {
this.eventMap = eventMap; this.eventMap = eventMap;
} }
public LanEvent getEvent() {
return event;
}
public void setGamepoints(Integer gamepoints) { public void setGamepoints(Integer gamepoints) {
this.gamepoints = gamepoints; this.gamepoints = gamepoints;
} }
......
...@@ -13,28 +13,19 @@ import javax.persistence.Entity; ...@@ -13,28 +13,19 @@ import javax.persistence.Entity;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany; import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.UniqueConstraint; import javax.persistence.UniqueConstraint;
import org.eclipse.persistence.annotations.PrivateOwned;
/** /**
* *
*/ */
@Entity @Entity
@Table(name = "roles", uniqueConstraints = { @UniqueConstraint(columnNames = { Role.EVENT_ID_COLUMN, Role.NAME_COLUMN }) }) @Table(name = "roles", uniqueConstraints = { @UniqueConstraint(columnNames = { Role.EVENT_ID_COLUMN, Role.NAME_COLUMN }) })
@NamedQueries({
@NamedQuery(name = "Role.findForEvent", query = "SELECT r FROM Role r where r.event = :event"),
@NamedQuery(name = "Role.findByRoleName", query = "SELECT r FROM Role r WHERE r.name = :name and r.event = :event"),
// @NamedQuery(name="Role.findParentsExcluding", query="select r from
// Role r, RoleRight rr where :user member of r.users ),
@NamedQuery(name = "Role.findForUser", query = "SELECT r FROM Role r WHERE :user MEMBER OF r.users and r.event = :event") })
public class Role extends GenericEntity { public class Role extends GenericEntity {
/**
*
*/
private static final long serialVersionUID = -4602863502464505404L; private static final long serialVersionUID = -4602863502464505404L;
protected static final String NAME_COLUMN = "role_name"; protected static final String NAME_COLUMN = "role_name";
...@@ -60,7 +51,8 @@ public class Role extends GenericEntity { ...@@ -60,7 +51,8 @@ public class Role extends GenericEntity {
private List<Role> parents = new ArrayList<Role>(); private List<Role> parents = new ArrayList<Role>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "role") @OneToMany(cascade = CascadeType.ALL, mappedBy = "role")
private List<ApplicationPermission> permissions; @PrivateOwned
private List<ApplicationPermission> permissions = new ArrayList<ApplicationPermission>();
@ManyToOne @ManyToOne
private CardTemplate cardTemplate; private CardTemplate cardTemplate;
......
...@@ -19,8 +19,6 @@ import javax.persistence.FetchType; ...@@ -19,8 +19,6 @@ import javax.persistence.FetchType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.JoinTable; import javax.persistence.JoinTable;
import javax.persistence.ManyToMany; import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.OneToOne; import javax.persistence.OneToOne;
import javax.persistence.OrderBy; import javax.persistence.OrderBy;
...@@ -29,7 +27,6 @@ import javax.persistence.Temporal; ...@@ -29,7 +27,6 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
import javax.persistence.Transient; import javax.persistence.Transient;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.eclipse.persistence.annotations.ConversionValue; import org.eclipse.persistence.annotations.ConversionValue;
import org.eclipse.persistence.annotations.Convert; import org.eclipse.persistence.annotations.Convert;
...@@ -50,14 +47,8 @@ import fi.insomnia.bortal.utilities.PasswordFunctions; ...@@ -50,14 +47,8 @@ import fi.insomnia.bortal.utilities.PasswordFunctions;
@ConversionValue(objectValue = "FEMALE", dataValue = "F"), @ConversionValue(objectValue = "FEMALE", dataValue = "F"),
@ConversionValue(objectValue = "UNDEFINED", dataValue = "U"), @ConversionValue(objectValue = "UNDEFINED", dataValue = "U"),
}) })
@NamedQueries({
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u order by u.created"),
@NamedQuery(name = "User.findByLogin", query = "SELECT u FROM User u WHERE u.login = :login") })
public class User extends GenericEntity { public class User extends GenericEntity {
public static final String ANONYMOUS_LOGINNAME = "anonymous";
/**
*
*/
private static final long serialVersionUID = -1632200627103418206L; private static final long serialVersionUID = -1632200627103418206L;
@Column(name = "created", nullable = false) @Column(name = "created", nullable = false)
...@@ -65,6 +56,10 @@ public class User extends GenericEntity { ...@@ -65,6 +56,10 @@ public class User extends GenericEntity {
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Calendar created = Calendar.getInstance(); private Calendar created = Calendar.getInstance();
@NotNull
@Column(name = "login", unique = true, nullable = false)
private String login = "";
@Column(name = "active", nullable = false, columnDefinition = "boolean default true") @Column(name = "active", nullable = false, columnDefinition = "boolean default true")
private boolean active = true; private boolean active = true;
...@@ -81,8 +76,6 @@ public class User extends GenericEntity { ...@@ -81,8 +76,6 @@ public class User extends GenericEntity {
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Calendar birthday; private Calendar birthday;
@NotNull
@Size(min = 2, message = "{user.nickSizeMessage}")
@Column(name = "nick") @Column(name = "nick")
private String nick = ""; private String nick = "";
...@@ -112,9 +105,6 @@ public class User extends GenericEntity { ...@@ -112,9 +105,6 @@ public class User extends GenericEntity {
@Column(name = "gender", nullable = false) @Column(name = "gender", nullable = false)
private Gender gender = Gender.UNDEFINED; private Gender gender = Gender.UNDEFINED;
@Column(name = "login", unique = true)
private String login;
@Column(name = "confirm_hash") @Column(name = "confirm_hash")
private String confirmHash; private String confirmHash;
...@@ -308,10 +298,13 @@ public class User extends GenericEntity { ...@@ -308,10 +298,13 @@ public class User extends GenericEntity {
} }
public void setLogin(String login) { public void setLogin(String login) {
if (login != null) { // Do not allow anonymous userchange
this.login = login.trim(); if (!isAnonymous()) {
} else { if (login != null) {
login = null; this.login = login.trim().toLowerCase();
} else {
login = null;
}
} }
} }
...@@ -508,4 +501,14 @@ public class User extends GenericEntity { ...@@ -508,4 +501,14 @@ public class User extends GenericEntity {
public List<PollAnswer> getPollAnswers() { public List<PollAnswer> getPollAnswers() {
return pollAnswers; return pollAnswers;
} }
@Transient
private Boolean isAnon;
public boolean isAnonymous() {
if (isAnon == null) {
isAnon = ANONYMOUS_LOGINNAME.equals(login);
}
return isAnon;
}
} }
package fi.insomnia.bortal.enums; package fi.insomnia.bortal.enums;
import fi.insomnia.bortal.enums.apps.BillPermission; import fi.insomnia.bortal.enums.apps.BillPermission;
import fi.insomnia.bortal.enums.apps.FixPerm;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.enums.apps.LoginPermission; import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.PollPermission;
import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
public enum BortalApplication { public enum BortalApplication {
// NOTE. add conversion Value to RoleRight // NOTE. add conversion Value to RoleRight
// PERMISSION("Description"), // PERMISSION("Description"),
LOGIN("Login related permissions", LoginPermission.class), // LOGIN("Login related permissions", LoginPermission.class),
USER("User management related", UserPermission.class), USER("User management related", UserPermission.class),
USER_MANAGEMENT("View all users(r), modify users(w), execute actions for user(x) "), // s ROLE("Role management", RolePermission.class),
ACCOUNT_MANAGEMENT("Manage others account events. view(r), modify(w) and create (shop)(x)"), BILL("Creating, and managing bills", BillPermission.class),
BILL("View all bills(r), Mark paid & modify(w), and create own bills (x)", BillPermission.class), POLL("Poll stuff", PollPermission.class),
MAP("view maps(r), Modify(w), reserve places from maps(x)"), MAP("Map management ", MapPermission.class),
ROLE_MANAGEMENT("User has right to view(r), modify(w) and assign(x) roles"), SHOP("Product & shop management", ShopPermission.class);
PRODUCT("View(r), modify(w), and shop(x) products"), // BILL("View all bills(r), Mark paid & modify(w), and create own bills (x)",
SHOP("View own shopped events(r), Modify own AccountEvents() and Shop(x)"), // BillPermission.class)
GAME("View(r) own, modify(w), view all(X)"), // USER_MANAGEMENT("View all users(r), modify users(w), execute actions for user(x) "),
POLL("View answers(r), create polls (w), answer to polls(x)"); // ACCOUNT_MANAGEMENT("Manage others account events. view(r), modify(w) and create (shop)(x)"),
// MAP("view maps(r), Modify(w), reserve places from maps(x)"),
private String description; // ROLE_MANAGEMENT("User has right to view(r), modify(w) and assign(x) roles"),
private Class<? extends IAppPermission> permissions; // PRODUCT("View(r), modify(w), and shop(x) products"),
// SHOP("View own shopped events(r), Modify own AccountEvents() and Shop(x)"),
// GAME("View(r) own, modify(w), view all(X)"),
// POLL("View answers(r), create polls (w), answer to polls(x)");
private final String description;
private final Class<? extends IAppPermission> permissions;
private BortalApplication(String descr, Class<? extends IAppPermission> perms) { private BortalApplication(String descr, Class<? extends IAppPermission> perms) {
this.permissions = perms; this.permissions = perms;
this.setDescription(descr); description = descr;
} }
public IAppPermission[] getPermissions() { public IAppPermission[] getPermissions() {
return permissions.getEnumConstants();
}
private BortalApplication(String descr) { return permissions.getEnumConstants();
this.permissions = FixPerm.class;
this.setDescription(descr);
}
public void setDescription(String description) {
this.description = description;
} }
public String getDescription() { public String getDescription() {
......
...@@ -3,11 +3,18 @@ package fi.insomnia.bortal.enums.apps; ...@@ -3,11 +3,18 @@ package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication; import fi.insomnia.bortal.enums.BortalApplication;
public enum BillPermission implements IAppPermission { public enum BillPermission implements IAppPermission {
READ_ALL("Read all bills"), WRITE_ALL("Modify all bills"), CREATE_BILL("Create bills for self") READ_ALL("Read all bills"),
WRITE_ALL("Modify all bills"),
CREATE_BILL("Create bills for self")
; ;
private String description;
private String fullName; public static final String S_READ_ALL = "BILL/READ_ALL";
public static final String S_CREATE_BILL = "BILL/CREATE_BILL";
public static final String S_WRITE_ALL = "BILL/WRITE_ALL";
private final String description;
private final String fullName;
private BillPermission(String desc) { private BillPermission(String desc) {
description = desc; description = desc;
......
...@@ -14,4 +14,7 @@ public interface IAppPermission extends Serializable { ...@@ -14,4 +14,7 @@ public interface IAppPermission extends Serializable {
public String getFullName(); public String getFullName();
@Override
public String toString();
} }
...@@ -3,7 +3,16 @@ package fi.insomnia.bortal.enums.apps; ...@@ -3,7 +3,16 @@ package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication; import fi.insomnia.bortal.enums.BortalApplication;
public enum MapPermission implements IAppPermission { public enum MapPermission implements IAppPermission {
MANAGE_OTHERS("Manage other users reservations in map"), BUY_PLACES("Reserve and buy places from map"), VIEW("View maps"); MANAGE_OTHERS("Manage other users reservations in map"),
BUY_PLACES("Reserve and buy places from map"),
VIEW("View maps"),
MANAGE_MAPS("Create and modify maps");
public static final String S_MANAGE_OTHERS = "MAP/MANAGE_OTHERS";
public static final String S_BUY_PLACES = "MAP/BUY_PLACES";
public static final String S_VIEW = "MAP/VIEW";
public static final String S_MANAGE_MAPS = "MAP/MANAGE_MAPS";
private String description; private String description;
private String fullName; private String fullName;
...@@ -15,7 +24,7 @@ public enum MapPermission implements IAppPermission { ...@@ -15,7 +24,7 @@ public enum MapPermission implements IAppPermission {
@Override @Override
public BortalApplication getParent() { public BortalApplication getParent() {
return BortalApplication.USER; return BortalApplication.MAP;
} }
@Override @Override
......
...@@ -2,21 +2,20 @@ package fi.insomnia.bortal.enums.apps; ...@@ -2,21 +2,20 @@ package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication; import fi.insomnia.bortal.enums.BortalApplication;
public enum LoginPermission implements IAppPermission { public enum NewsPermission implements IAppPermission {
MANAGE("Manage newsgroups");
LOGIN("Can login"), LOGOUT("Can logout");
private String description; private String description;
private String fullName; private String fullName;
private LoginPermission(String desc) { private NewsPermission(String desc) {
this.description = desc; this.description = desc;
fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString(); fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString();
} }
@Override @Override
public BortalApplication getParent() { public BortalApplication getParent() {
return BortalApplication.LOGIN; return BortalApplication.SHOP;
} }
@Override @Override
......
...@@ -2,20 +2,23 @@ package fi.insomnia.bortal.enums.apps; ...@@ -2,20 +2,23 @@ package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication; import fi.insomnia.bortal.enums.BortalApplication;
public enum FixPerm implements IAppPermission { public enum PollPermission implements IAppPermission {
FIX("FIX THIS"); ANSWER("Can answer and view availabe polls"),
VIEW_RESULTS("View anonymized poll results"),
CREATE("Create and manage polls")
private final String description; ;
private final String fullName; private String description;
private String fullName;
private FixPerm(String desc) { private PollPermission(String desc) {
this.description = desc; this.description = desc;
fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString(); fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString();
} }
@Override @Override
public BortalApplication getParent() { public BortalApplication getParent() {
return BortalApplication.LOGIN; return BortalApplication.POLL;
} }
@Override @Override
......
package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication;
public enum ShopPermission implements IAppPermission {
LIST_USERPRODUCTS("List products for users in shop"),
LIST_ALL_PRODUCTS("List all products in shop"),
SHOP_TO_OTHERS("Shop to other users"),
SHOP_PRODUCTS("Shop products to self"),
MANAGE_PRODUCTS("Create and modify products");
public static final String S_LIST_USERPRODUCTS = "SHOP/LIST_USERPRODUCTS";
public static final String S_LIST_ALL_PRODUCTS = "SHOP/LIST_ALL_PRODUCTS";
public static final String S_SHOP_TO_OTHERS = "SHOP/SHOP_TO_OTHERS";
public static final String S_SHOP_PRODUCTS = "SHOP/SHOP_PRODUCTS";
public static final String S_MANAGE_PRODUCTS = "SHOP/MANAGE_PRODUCTS";
private String description;
private String fullName;
private ShopPermission(String desc) {
this.description = desc;
fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString();
}
@Override
public BortalApplication getParent() {
return BortalApplication.SHOP;
}
@Override
public String getDescription() {
return this.description;
}
@Override
public String getFullName() {
return fullName;
}
}
...@@ -3,7 +3,27 @@ package fi.insomnia.bortal.enums.apps; ...@@ -3,7 +3,27 @@ package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication; import fi.insomnia.bortal.enums.BortalApplication;
public enum UserPermission implements IAppPermission { public enum UserPermission implements IAppPermission {
VIEW("View all users"), MODIFY("Modify users"); VIEW_ALL("View all users"),
MODIFY("Modify users"),
CREATE_NEW("Create new user"),
VIEW_SELF("Can view self"),
LOGIN("Can login"),
LOGOUT("Can logout"),
READ_ROLES("View all roles."),
WRITE_ROLES("Modify roles"),
VIEW_ACCOUNTEVENTS("Show other users account events"),
MODIFY_ACCOUNTEVENTS("Modify Account events");
public static final String S_VIEW_ALL = "USER/VIEW_ALL";
public static final String S_MODIFY = "USER/MODIFY";
public static final String S_CREATE_NEW = "USER/CREATE_NEW";
public static final String S_VIEW_SELF = "USER/VIEW_SELF";
public static final String S_LOGIN = "USER/LOGIN";
public static final String S_LOGOUT = "USER/LOGOUT";
public static final String S_READ_ROLES = "USER/READ_ROLES";
public static final String S_WRITE_ROLES = "USER/WRITE_ROLES";
public static final String S_VIEW_ACCOUNTEVENTS = "USER/VIEW_ACCOUNTEVENTS";
public static final String S_MODIFY_ACCOUNTEVENTS = "USER/MODIFY_ACCOUNTEVENTS";
private String description; private String description;
private String fullName; private String fullName;
......
...@@ -24,6 +24,7 @@ public class I18n { ...@@ -24,6 +24,7 @@ public class I18n {
} }
public static String get(String key, Object... params) { public static String get(String key, Object... params) {
return MessageFormat.format(get(key), params); return MessageFormat.format(get(key), params);
} }
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<pageflow:Pageflow xmlns:pageflow="http://www.sybase.com/suade/pageflow" id="pf13012981621060" configfile="/LanBortalWeb/WebContent/WEB-INF/faces-config.xml"/> <pageflow:Pageflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pageflow="http://www.sybase.com/suade/pageflow" id="pf13012981621060" configfile="/LanBortalWeb/WebContent/WEB-INF/faces-config.xml">
<nodes xsi:type="pageflow:PFPage" name="place/placemap" x="180" y="137" id="pf13156916815477" outlinks="pf13156916815478" inlinks="pf13156916815478" path="/place/placemap.xhtml"/>
<links id="pf13156916815478" target="pf13156916815477" source="pf13156916815477" outcome="placesReserved" redirect="true">
<bendPoints d1Height="-36" d2Height="-36"/>
<bendPoints d1Width="3" d1Height="-86" d2Width="3" d2Height="-86"/>
<bendPoints d1Width="-65" d1Height="-88" d2Width="-65" d2Height="-88"/>
<bendPoints d1Width="-64" d2Width="-64"/>
</links>
</pageflow:Pageflow>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faces-config <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application> <application>
<resource-bundle> <resource-bundle>
<base-name>fi.insomnia.bortal.resources.i18n</base-name> <base-name>fi.insomnia.bortal.resources.i18n</base-name>
...@@ -22,93 +20,75 @@ ...@@ -22,93 +20,75 @@
</locale-config> </locale-config>
</application> </application>
<navigation-rule> <!-- <navigation-rule> -->
<from-view-id>/role/create.xhtml</from-view-id> <!-- <from-view-id>/user/list.xhtml</from-view-id> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>roleCreated</from-outcome> <!-- <from-outcome>userEdit</from-outcome> -->
<to-view-id>/role/edit.xhtml</to-view-id> <!-- <to-view-id>/user/edit.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
</navigation-rule> <!-- </navigation-rule> -->
<navigation-rule> <!-- <navigation-rule> -->
<from-view-id>/user/list.xhtml</from-view-id> <!-- <from-view-id>/user/edit.xhtml</from-view-id> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>userEdit</from-outcome> <!-- <from-outcome>userSave</from-outcome> -->
<to-view-id>/user/edit.xhtml</to-view-id> <!-- <to-view-id>/user/edit.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
</navigation-rule> <!-- </navigation-rule> -->
<navigation-rule> <!-- <navigation-rule> -->
<from-view-id>/user/edit.xhtml</from-view-id> <!-- <from-view-id>/role/list.xhtml</from-view-id> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>userSave</from-outcome> <!-- <from-outcome>roleEdit</from-outcome> -->
<to-view-id>/user/edit.xhtml</to-view-id> <!-- <to-view-id>/role/edit.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
</navigation-rule> <!-- </navigation-rule> -->
<navigation-rule>
<from-view-id>/role/list.xhtml</from-view-id>
<navigation-case>
<from-outcome>roleEdit</from-outcome>
<to-view-id>/role/edit.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule> <!-- <navigation-rule> -->
<from-view-id>*</from-view-id> <!-- <from-view-id>*</from-view-id> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>frontpage</from-outcome> <!-- <from-outcome>frontpage</from-outcome> -->
<to-view-id>/news/frontpage.xhtml</to-view-id> <!-- <to-view-id>/news/frontpage.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>userprefs</from-outcome> <!-- <from-outcome>userprefs</from-outcome> -->
<to-view-id>/news/edit.xhtml</to-view-id> <!-- <to-view-id>/news/edit.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>shopfrontpage</from-outcome> <!-- <from-outcome>shopfrontpage</from-outcome> -->
<to-view-id>/product/createBill.xhtml</to-view-id> <!-- <to-view-id>/product/createBill.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
<navigation-case> <!-- <navigation-case> -->
<from-outcome>adminfront</from-outcome> <!-- <from-outcome>adminfront</from-outcome> -->
<to-view-id>/admin/frontpage.xhtml</to-view-id> <!-- <to-view-id>/admin/frontpage.xhtml</to-view-id> -->
</navigation-case> <!-- </navigation-case> -->
<navigation-case> <!-- </navigation-rule> -->
<from-outcome>permissionDenied</from-outcome> <!-- <navigation-rule> -->
<to-view-id>/permissionDenied.xhtml</to-view-id> <!-- <from-view-id>/role/edit.xhtml</from-view-id> -->
</navigation-case> <!-- <navigation-case> -->
<navigation-case> <!-- <from-outcome>roleSaved</from-outcome> -->
<from-outcome>viewExpired</from-outcome> <!-- <to-view-id>/role/edit.xhtml</to-view-id> -->
<to-view-id>/viewExpired.xhtml</to-view-id> <!-- </navigation-case> -->
</navigation-case> <!-- </navigation-rule> -->
<navigation-case> <!-- <navigation-rule> -->
<from-outcome>logout</from-outcome>
<to-view-id>/auth/logout.xhtml</to-view-id> <!-- <from-view-id>/product/createBill.xhtml</from-view-id> -->
</navigation-case> <!-- <navigation-case> -->
<navigation-case> <!-- <from-outcome>success</from-outcome> -->
<from-outcome>loginSuccess</from-outcome> <!-- <to-view-id>/bill/list.xhtml</to-view-id> -->
<to-view-id>/NotImplementedYet.xhtml</to-view-id> <!-- </navigation-case> -->
</navigation-case> <!-- </navigation-rule> -->
<navigation-case> <factory>
<from-outcome>loginFailed</from-outcome> <exception-handler-factory>fi.insomnia.bortal.exceptions.BortalExceptionHandlerFactory</exception-handler-factory>
<to-view-id>/NotImplementedYet.xhtml</to-view-id> </factory>
</navigation-case>
</navigation-rule>
<navigation-rule> <navigation-rule>
<from-view-id>/role/edit.xhtml</from-view-id> <display-name>place/placemap</display-name>
<from-view-id>/place/placemap.xhtml</from-view-id>
<navigation-case> <navigation-case>
<from-outcome>roleSaved</from-outcome> <from-outcome>placesReserved</from-outcome>
<to-view-id>/role/edit.xhtml</to-view-id> <to-view-id>/place/placemap.xhtml</to-view-id>
<redirect />
</navigation-case> </navigation-case>
</navigation-rule> </navigation-rule>
<navigation-rule>
<from-view-id>/product/createBill.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/bill/list.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<factory>
<exception-handler-factory>fi.insomnia.bortal.exceptions.BortalExceptionHandlerFactory</exception-handler-factory>
</factory>
</faces-config> </faces-config>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:login="http://java.sun.com/jsf/composite/tools/login" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:login="http://java.sun.com/jsf/composite/cditools/login" xmlns:c="http://java.sun.com/jsp/jstl/core"
> >
<h:head> <h:head>
<title></title> <title></title>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" xmlns:f="http://java.sun.com/jsf/core"
xmlns:login="http://java.sun.com/jsf/composite/tools/login" xmlns:login="http://java.sun.com/jsf/composite/cditools/login"
xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.logout" /> <ui:param name="thispage" value="page.auth.logout" />
<f:metadata>
<f:event type="preRenderView" listener="#{authView.executeLogout}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:outputText value="#{i18n['login.logoutmessage']}" /> <h:outputText value="#{i18n['login.logoutmessage']}" />
<h:outputScript>
window.location="#{request.contextPath}"
</h:outputScript>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.logoutsuccess" />
<ui:define name="content">
<h:outputText value="#{i18n['login.logoutmessage']}" />
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -4,36 +4,34 @@ ...@@ -4,36 +4,34 @@
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:login="http://java.sun.com/jsf/composite/tools/login" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:login="http://java.sun.com/jsf/composite/tools/login" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<h:head> <h:head>
<title></title> <title></title>
</h:head> </h:head>
<h:body> <h:body>
<ui:composition template="/layout/${sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/${sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.resetPassword" /> <ui:param name="thispage" value="page.auth.resetPassword" />
<ui:define name="metadata"> <f:metadata>
<f:metadata> <f:viewParam name="id" value="#{pwdResetView.id}" />
<f:viewParam name="id" value="#{pwdResetView.id}" /> <f:viewParam name="hash" value="#{pwdResetView.hash}" />
<f:viewParam name="hash" value="#{pwdResetView.hash}" /> <f:event type="preRenderView" listener="#{pwdResetView.initView}" />
</f:metadata> </f:metadata>
</ui:define>
<ui:define name="content"> <ui:define name="content">
<h:form rendered="#{!empty pwdResetView.user}">
<h:form rendered="#{pwdResetView.hashMatch()}">
<h:inputHidden value="#{pwdResetView.user.id}" />
<h:panelGrid columns="3"> <h:panelGrid columns="3">
<h:outputLabel value="#{i18n['user.password']}:" for="password" /> <h:outputLabel value="#{i18n['user.password']}:" for="password" />
<h:inputSecret id="password" value="#{pwdResetView.password}" /> <h:inputSecret validator="#{userValidator.password}" id="password" value="#{pwdResetView.password}" />
<h:message for="password" /> <h:message for="password" />
<h:outputLabel value="#{i18n['user.passwordcheck']}:" for="passwordcheck" /> <h:outputLabel value="#{i18n['user.passwordcheck']}:" for="passwordcheck" />
<h:inputSecret id="passwordcheck" value="#{pwdResetView.confirm}" /> <h:inputSecret validator="#{userValidator.password}" id="passwordcheck" value="#{pwdResetView.confirm}" />
<h:message for="passwordcheck" /> <h:message for="passwordcheck" />
</h:panelGrid> </h:panelGrid>
<h:commandButton id="changePassword" value="#{i18n['user.changePassword']}" action="#{pwdResetView.change()}" /> <h:commandButton id="changePassword" value="#{i18n['user.changePassword']}" action="#{pwdResetView.change()}" />
</h:form> </h:form>
<h:outputText rendered="#{!pwdResetView.hashMatch() }" value="#{i18n['passwordReset.hashNotFound']}" /> <h:outputText rendered="#{empty pwdResetView.user}" value="#{i18n['passwordReset.hashNotFound']}" />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core" >
xmlns:users="http://java.sun.com/jsf/composite/tools/user" <h:body>
xmlns:c="http://java.sun.com/jsp/jstl/core"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<h:body> <ui:param name="thispage" value="page.eventorg.edit" />
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.edit" />
<ui:define name="content"> <ui:define name="content">
<h:form id="orgform"> <h:form id="orgform">
<h:inputHidden value="#{eventorgView.eventorg.id}" /> <h:panelGrid columns="2">
<h:panelGrid columns="2"> <h:outputLabel value="#{i18n['eventorg.organisation']}:" />
<h:outputLabel value="#{i18n['eventorg.organisation']}:" /><h:inputText value="#{eventorgView.eventorg.organisation}" /> <h:inputText value="#{eventorgView.eventorg.organisation}" />
<h:outputLabel value="#{i18n['eventorg.bundleCountry']}:" /><h:inputText value="#{eventorgView.eventorg.bundleCountry}" /> <h:outputLabel value="#{i18n['eventorg.bundleCountry']}:" />
<h:outputLabel value="#{i18n['eventorg.billAddress1']}:" /><h:inputText value="#{eventorgView.eventorg.billAddress1}" /> <h:inputText value="#{eventorgView.eventorg.bundleCountry}" />
<h:outputLabel value="#{i18n['eventorg.billAddress2']}:" /><h:inputText value="#{eventorgView.eventorg.billAddress2}" /> <h:outputLabel value="#{i18n['eventorg.billAddress1']}:" />
<h:outputLabel value="#{i18n['eventorg.billAddress3']}:" /><h:inputText value="#{eventorgView.eventorg.billAddress3}" /> <h:inputText value="#{eventorgView.eventorg.billAddress1}" />
<h:outputLabel value="#{i18n['eventorg.billAddress4']}:" /><h:inputText value="#{eventorgView.eventorg.billAddress4}" /> <h:outputLabel value="#{i18n['eventorg.billAddress2']}:" />
<h:outputLabel value="#{i18n['eventorg.bankNumber1']}:" /><h:inputText value="#{eventorgView.eventorg.bankNumber1}" /> <h:inputText value="#{eventorgView.eventorg.billAddress2}" />
<h:outputLabel value="#{i18n['eventorg.bankNumber2']}:" /><h:inputText value="#{eventorgView.eventorg.bankNumber2}" /> <h:outputLabel value="#{i18n['eventorg.billAddress3']}:" />
<h:outputLabel value="#{i18n['eventorg.bankName1']}:" /><h:inputText value="#{eventorgView.eventorg.bankName1}" /> <h:inputText value="#{eventorgView.eventorg.billAddress3}" />
<h:outputLabel value="#{i18n['eventorg.bankName2']}:" /><h:inputText value="#{eventorgView.eventorg.bankName2}" /> <h:outputLabel value="#{i18n['eventorg.billAddress4']}:" />
<h:commandButton id="commitbtn" action="#{eventorgView.save()}" value="#{i18n['eventorg.save']}" /> <h:inputText value="#{eventorgView.eventorg.billAddress4}" />
</h:panelGrid> <h:outputLabel value="#{i18n['eventorg.bankNumber1']}:" />
</h:form> <h:inputText value="#{eventorgView.eventorg.bankNumber1}" />
<h2>#{i18n['eventorg.createevent']}</h2> <h:outputLabel value="#{i18n['eventorg.bankNumber2']}:" />
<h:form id="createevent" > <h:inputText value="#{eventorgView.eventorg.bankNumber2}" />
<h:outputLabel value="#{i18n['eventorg.bankName1']}:" />
<h:inputText value="#{eventorgView.eventorg.bankName1}" />
<h:outputLabel value="#{i18n['eventorg.bankName2']}:" />
<h:inputText value="#{eventorgView.eventorg.bankName2}" />
<h:commandButton id="commitbtn" action="#{eventorgView.save()}" value="#{i18n['eventorg.save']}" />
</h:panelGrid>
</h:form>
<h2>#{i18n['eventorg.createevent']}</h2>
<h:form id="createevent">
<h:outputLabel for="createEventName" value="#{i18n['event.name']}" /> <h:outputLabel for="createEventName" value="#{i18n['event.name']}" />
<h:inputText id="createEventName" value="#{eventorgView.eventname}" /> <h:inputText id="createEventName" value="#{eventorgView.eventname}" />
<h:commandButton action="#{eventorgView.createEvent()}" value="#{i18n['eventorg.createEvent']}" /> <h:commandButton action="#{eventorgView.createEvent()}" value="#{i18n['eventorg.createEvent']}" />
</h:form> </h:form>
<h2>#{i18n['eventorg.events']}</h2> <h2>#{i18n['eventorg.events']}</h2>
<h:form id="orgsEventlist"> <h:form id="orgsEventlist">
<h:dataTable border="1" id="org" value="#{eventorgView.orgsEvents}" var="event"> <h:dataTable border="1" id="org" value="#{eventorgView.orgsEvents}" var="event">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['event.name']}" /> <h:outputText value="${i18n['event.name']}" />
</f:facet> </f:facet>
<h:outputText value="#{event.name}" /> <h:outputText value="#{event.name}" />
</h:column> </h:column>
<h:column > <h:column>
<h:commandButton action="#{eventorgView.editEvent()}" value="#{i18n['eventorg.editEvent']}" /> <h:commandButton action="#{eventorgView.editEvent()}" value="#{i18n['eventorg.editEvent']}" />
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</h:form> </h:form>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
<br /> <br />
<h:commandButton value="Generate test poll data" action="#{TestDataView.generatePollData()}" /> <h:commandButton value="Generate test poll data" action="#{TestDataView.generatePollData()}" />
<br /> <br />
<h:commandButton value="convert usernames" action="#{TestDataView.convertUsernames()}" />
<br />
</h:form> </h:form>
</h:body> </h:body>
</html> </html>
......
...@@ -3,65 +3,62 @@ ...@@ -3,65 +3,62 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/cditools"> xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
>
<h:body> <h:body>
<ui:composition rendered="#{sessionHandler.loggedIn}" template="/layout/insomnia1/sidebartemplate.xhtml"> <ui:composition rendered="#{sessionHandler.loggedIn}" template="/layout/insomnia1/sidebartemplate.xhtml">
<ui:param name="rendered" value="true" /> <ui:param name="rendered" value="true" />
<ui:define name="sidebarcontent"> <ui:define name="sidebarcontent">
<ul> <ul>
<tools:canRead target="ROLE_MANAGEMENT"> <li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.roles']}" />
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.roles']}" />
<ul> <ul>
<li><h:link outcome="/role/create" value="#{i18n['sidebar.role.create']}" /></li> <li><h:link outcome="/role/create" value="#{i18n['sidebar.role.create']}" />
<li><h:link outcome="/role/list" value="#{i18n['sidebar.role.list']}" /></li> </li>
<li><h:link outcome="/user/createCardTemplate" value="#{i18n['sidebar.cardTemplate.create']}" /></li> <li><h:link outcome="/role/list" value="#{i18n['sidebar.role.list']}" />
<li><h:link outcome="/user/listCardTemplates" value="#{i18n['sidebar.cardTemplate.list']}" /></li> </li>
<li><h:link outcome="/user/createCardTemplate" value="#{i18n['sidebar.cardTemplate.create']}" />
</li>
<li><h:link outcome="/user/listCardTemplates" value="#{i18n['sidebar.cardTemplate.list']}" />
</li>
</ul> </ul></li>
</li> <li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.bills']}" />
</tools:canRead>
<tools:canRead target="BILL">
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.bills']}" />
<ul> <ul>
<li><h:link outcome="/bill/list" value="#{i18n['sidebar.bill.listAll']}" /></li> <li><h:link outcome="/bill/list" value="#{i18n['sidebar.bill.listAll']}" />
<li><h:link outcome="/bill/billSummary" value="#{i18n['sidebar.bill.summary']}" /></li> </li>
</ul> <li><h:link outcome="/bill/billSummary" value="#{i18n['sidebar.bill.summary']}" />
</li> </li>
</tools:canRead> </ul></li>
<tools:canRead target="USER_MANAGEMENT"> <li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.users']}" />
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.users']}" />
<ul> <ul>
<li><h:link outcome="/user/create" value="#{i18n['sidebar.user.create']}" /></li> <li><h:link outcome="/user/create" value="#{i18n['sidebar.user.create']}" />
<li><h:link outcome="/user/list" value="#{i18n['sidebar.user.list']}" /></li> </li>
</ul> <li><h:link outcome="/user/list" value="#{i18n['sidebar.user.list']}" />
</li> </li>
</tools:canRead> </ul></li>
<tools:canRead target="PRODUCT"> <li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.products']}" />
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.products']}" />
<ul> <ul>
<li><h:link outcome="/product/create" value="#{i18n['sidebar.product.create']}" /></li> <li><h:link outcome="/product/create" value="#{i18n['sidebar.product.create']}" />
<li><h:link outcome="/product/list" value="#{i18n['sidebar.product.list']}" /></li> </li>
</ul> <li><h:link outcome="/product/list" value="#{i18n['sidebar.product.list']}" />
</li> </li>
</tools:canRead> </ul></li>
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.maps']}" />
<tools:canRead target="MAP">
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.maps']}" />
<ul> <ul>
<li><h:link outcome="/map/list" value="#{i18n['sidebar.map.list']}" /></li> <li><h:link outcome="/map/list" value="#{i18n['sidebar.map.list']}" />
</ul> </li>
</li> </ul></li>
</tools:canRead>
<li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.other']}" /> <li><h:outputText styleClass="sidebartitle" value="#{i18n['sidebar.other']}" />
<ul> <ul>
<li><h:link outcome="/eventorg/list" value="#{i18n['sidebar.eventorg.list']}" /></li> <li><h:link outcome="/eventorg/list" value="#{i18n['sidebar.eventorg.list']}" />
<li><h:link outcome="/utils/flushCache" value="#{i18n['sidebar.utils.flushCache']}" /></li> </li>
<li><h:link outcome="/generateTestData" value="#{i18n['sidebar.utils.testdata']}" /></li> <li><h:link outcome="/utils/flushCache" value="#{i18n['sidebar.utils.flushCache']}" />
</li>
<li><h:link outcome="/generateTestData" value="#{i18n['sidebar.utils.testdata']}" />
</li>
</ul> </ul></li>
</li>
</ul> </ul>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
<ui:define name="sidebarcontent"> <ui:define name="sidebarcontent">
<ul> <ul>
<li><h:link outcome="/user/create.xhtml" value="#{i18n['sidebar.createuser']}"/></li> <li><h:link outcome="/user/create.xhtml" value="#{i18n['sidebar.createuser']}"/></li>
<li><h:link outcome="/auth/sendResetMail" value="#{i18n['loginerror.resetpassword']}" /></li>
</ul> </ul>
</ui:define> </ui:define>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" >
xmlns:f="http://java.sun.com/jsf/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/insomnia1/sidebartemplate.xhtml"> <ui:composition template="/layout/insomnia1/sidebartemplate.xhtml">
<ui:param name="rendered" value="#{sessionHandler.isLoggedIn()}" /> <ui:param name="rendered" value="#{sessionHandler.isLoggedIn()}" />
<ui:define name="sidebarcontent"> <ui:define name="sidebarcontent">
<ul> <h1>
<li><h:link outcome="/user/sendPicture" value="#{i18n['user.sendPicture']}"/></li> <h:link outcome="/user/edit" value="#{userView.selectedUser.wholeName}">
<li><h:link outcome="/user/changePassword" value="#{i18n['user.changePassword']}"/></li> <f:param name="userid" value="#{userView.selectedUser.id}" />
<li><h:link outcome="/user/accountEvents" value="#{i18n['user.accountEvents']}"/></li> </h:link>
<li><h:link outcome="/place/myGroups" value="#{i18n['user.myGroups']}"/></li> </h1>
<li><h:link outcome="/place/insertToken" value="#{i18n['user.insertToken']}"/></li> <ul>
<!-- <li><h:link outcome="/user/sendPicture" value="#{i18n['user.sendPicture']}">
<f:param name="userid" value="#{userView.selectedUser.id}" />
</h:link></li>
-->
<li><h:link outcome="/user/changePassword" value="#{i18n['user.changePassword']}">
<f:param name="userid" value="#{userView.selectedUser.id}" />
</h:link></li>
<li><h:link outcome="/user/accountEvents" value="#{i18n['user.accountEvents']}">
<f:param name="userid" value="#{userView.selectedUser.id}" />
</h:link></li>
<li><h:link outcome="/place/myGroups" value="#{i18n['user.myGroups']}">
<f:param name="userid" value="#{userView.selectedUser.id}" />
</h:link>
</li>
<li><h:link outcome="/place/insertToken" value="#{i18n['user.insertToken']}">
<f:param name="userid" value="#{userView.selectedUser.id}" />
</h:link>
</li>
</ul> </ul>
......
...@@ -7,12 +7,10 @@ ...@@ -7,12 +7,10 @@
<f:view locale="#{sessionHandler.locale}"> <f:view locale="#{sessionHandler.locale}">
<ui:insert name="metadata" />
<h:head> <h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><h:outputText value="#{i18n['global.eventname']}" /> - <h:outputText <title><h:outputText value="#{layoutView.getHeader(thispage)}" />
value="#{i18n[util.concat(thispage,'.header') ] }" </title>
/></title>
<meta name="description" content="Insomnia lippukauppa" /> <meta name="description" content="Insomnia lippukauppa" />
<meta name="author" content="Niko Juusela, csharp" /> <meta name="author" content="Niko Juusela, csharp" />
<meta http-equiv="Content-Language" content="fi" /> <meta http-equiv="Content-Language" content="fi" />
...@@ -26,7 +24,10 @@ ...@@ -26,7 +24,10 @@
<img src="#{request.contextPath}/resources/style/insomnia2/img/logo.png" /> <img src="#{request.contextPath}/resources/style/insomnia2/img/logo.png" />
</div> </div>
<div id="login"> <div id="login">
<tools:isLoggedIn>#{sessionHandler.currentUser.nick}</tools:isLoggedIn> <h:outputText rendered="#{sessionHandler.loggedIn}"
value="Olet kirjautunut käyttäjällä: #{sessionHandler.currentUser.nick}"
/>
<tools:loginLogout /> <tools:loginLogout />
</div> </div>
</div> </div>
...@@ -37,25 +38,42 @@ ...@@ -37,25 +38,42 @@
<li><h:link outcome="/index" value="#{i18n['topmenu.frontpage']}" <li><h:link outcome="/index" value="#{i18n['topmenu.frontpage']}"
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'frontpage'?'active':''}" styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'frontpage'?'active':''}"
/></li> /></li>
<li> <c:if test="#{sessionHandler.isLoggedIn()}">
<h:link outcome="/user/edit" value="#{i18n['topmenu.usersPreferences']}" styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'user'?'active':''}" /> <li><h:link outcome="/user/edit" value="#{i18n['topmenu.usersPreferences']}"
</li> styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'user'?'active':''}"
<li><h:link outcome="/poll/start" value="#{i18n['topmenu.poll']}" styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'poll'?'active': ''}" /></li> />
<li><h:link outcome="/place/placemap" value="#{i18n['topmenu.placemap']}" </li>
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'placemap'?'active':''}" <!--
/> <li><h:link outcome="/poll/start" value="#{i18n['topmenu.poll']}"
</li> styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'poll'?'active': ''}"
<li><h:link outcome="/product/list" value="#{i18n['topmenu.adminfront']}" /></li>
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'admin'?'active':''}" -->
/></li> </c:if>
<li><h:link outcome="/shop/showReaderEvents" value="#{i18n['topmenu.rfidshop']}" <c:if test="#{mapView.canView()}">
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'rfidshop'?'active':''}" <li><h:link outcome="/place/placemap" value="#{i18n['topmenu.placemap']}"
/> styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'placemap'?'active':''}"
</li> />
<li><h:link outcome="/game/start" value="#{i18n['topmenu.game']}" </li>
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'game'?'active':''}" </c:if>
/> <c:if test="#{sessionHandler.isLoggedIn()}">
</li> <!--<li><h:link outcome="/product/list" value="#{i18n['topmenu.adminfront']}"
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'admin'?'active':''}"
/>
</li>-->
<li><h:link outcome="/shop/createBill" value="#{i18n['sidebar.product.createBill']}"
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'admin'?'active':''}"
/>
</li>
<!-- <li><h:link outcome="/shop/showReaderEvents" value="#{i18n['topmenu.rfidshop']}"
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'rfidshop'?'active':''}"
/>
</li>
<li><h:link outcome="/game/start" value="#{i18n['topmenu.game']}"
styleClass="#{i18n[util.concat(thispage,'.pagegroup')] == 'game'?'active':''}"
/>
</li>
-->
</c:if>
</ul> </ul>
</div> </div>
<div id="container" class="top"></div> <div id="container" class="top"></div>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:map="http://java.sun.com/jsf/composite/cditools/map" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core" >
xmlns:map="http://java.sun.com/jsf/composite/tools/map"
xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.role.edit" /> <ui:param name="thispage" value="page.role.edit" />
<ui:define name="content"> <ui:define name="content">
<map:create />
</ui:define> <h:form>
</ui:composition> <h:panelGrid columns="2">
<h:outputText value="#{i18n['map.name']}" />
<h:inputText value="#{mapManageView.mapname}" />
<h:commandButton id="createrole" value="#{i18n['map.create']}" action="#{mapManageView.createMap}" />
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
</h:body> </h:body>
</html> </html>
\ No newline at end of file
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:map="http://java.sun.com/jsf/composite/tools/map" xmlns:map="http://java.sun.com/jsf/composite/cditools/map" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"> >
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
<f:viewParam name="mapid" value="#{mapManageView.mapId}" />
<f:event type="preRenderView" listener="#{mapManageView.initView}" />
</f:metadata>
<ui:param name="thispage" value="page.role.edit" /> <ui:param name="thispage" value="page.role.edit" />
<ui:define name="content"> <ui:define name="content">
<map:edit commitaction="#{mapManageView.saveMap()}" commitvalue="#{i18n['mapEdit.save']}"/> <map:edit commitaction="#{mapManageView.saveMap()}" commitvalue="#{i18n['mapEdit.save']}" />
<map:setBuyable /> <map:setBuyable />
<img width="600" src="#{request.contextPath}#{mapView.selectPlaceMapUrl}" <img width="600" src="#{request.contextPath}/PlaceMap?mapid=#{mapView.activeMap.id.id}" alt="placeimage" />
alt="placeimage" />
<map:genplaces /> <map:genplaces />
<map:submitBg /> <map:submitBg />
<!-- <map:listPlaces /> <!-- <map:listPlaces />
--> -->
</ui:define> </ui:define>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:map="http://java.sun.com/jsf/composite/cditools/map" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:map="http://java.sun.com/jsf/composite/tools/map" >
xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.role.list" /> <ui:param name="thispage" value="page.role.list" />
<ui:define name="content"> <ui:define name="content">
<map:list /> <map:list />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
</html> </html>
\ No newline at end of file
...@@ -47,7 +47,9 @@ ...@@ -47,7 +47,9 @@
<h:outputLabel value="#{i18n['place.product']}:" /> <h:outputLabel value="#{i18n['place.product']}:" />
<h:outputText value="#{placeView.place.product.name}" /> <h:outputText value="#{placeView.place.product.name}" />
<h:outputLabel value="#{i18n['place.buyable']}" />
<h:selectBooleanCheckbox value="#{plaveView.place.buyable}"/>
<h:outputLabel value="#{i18n['place.description']}:" /> <h:outputLabel value="#{i18n['place.description']}:" />
<h:inputTextarea value="#{placeView.place.description}" /> <h:inputTextarea value="#{placeView.place.description}" />
......
...@@ -3,18 +3,24 @@ ...@@ -3,18 +3,24 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:f="http://java.sun.com/jsf/core"> xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:f="http://java.sun.com/jsf/core"
>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.place.insertToken" /> <ui:param name="thispage" value="page.place.insertToken" />
<f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{userView.initView}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h1>#{i18n['placetoken.pageHeader']}</h1> <h1>#{i18n['placetoken.pageHeader']}</h1>
<p>#{i18n['placetoken.topText']}</p> <p>#{i18n['placetoken.topText']}</p>
<h:form id="placeTokenForm"> <h:form id="placeTokenForm">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel value="#{i18n['placetoken.token']}:" /> <h:outputLabel value="#{i18n['placetoken.token']}:" />
<h:inputText value="#{placeGroupView.token}" /> <h:inputText value="#{tokenView.token}" />
<h:commandButton id="commitbtn" action="#{placeGroupView.saveToken()}" value="#{i18n['placetoken.commit']}" /> <h:commandButton id="commitbtn" action="#{tokenView.saveToken()}" value="#{i18n['placetoken.commit']}" />
</h:panelGrid> </h:panelGrid>
</h:form> </h:form>
</ui:define> </ui:define>
......
...@@ -8,12 +8,11 @@ ...@@ -8,12 +8,11 @@
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.place.mygroups" /> <ui:param name="thispage" value="page.place.mygroups" />
<ui:define name="content"> <ui:define name="content">
#{placeGroupView.editSelf()}
<h1>#{i18n['placegroupview.header']}</h1> <h1>#{i18n['placegroupview.header']}</h1>
<p>#{i18n['placegroupview.toptext']}</p> <p>#{i18n['placegroupview.toptext']}</p>
<h:outputText rendered="#{!(placeGroupView.groupMemberships.rowCount gt 0)}" <h:outputText rendered="#{empty placeGroupView.groupMemberships}"
value="#{i18n['placegroupview.noMemberships']}" /> value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{placeGroupView.groupMemberships.rowCount gt 0}" id="placelistform"> <h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform">
<p><a href="#{request.contextPath}/PlaceGroupPdf">#{i18n['placegroup.printPdf']}</a></p> <p><a href="#{request.contextPath}/PlaceGroupPdf">#{i18n['placegroup.printPdf']}</a></p>
<h:dataTable value="#{placeGroupView.groupMemberships}" var="member"> <h:dataTable value="#{placeGroupView.groupMemberships}" var="member">
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:map="http://java.sun.com/jsf/composite/tools/map" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:map="http://java.sun.com/jsf/composite/cditools/map" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
> >
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:products="http://java.sun.com/jsf/composite/cditools/products"
xmlns:h="http://java.sun.com/jsf/html" >
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:products="http://java.sun.com/jsf/composite/tools/products"
xmlns:tools="http://java.sun.com/jsf/composite/tools">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
<f:event type="preRenderView" listener="#{productView.initCreateView}" />
</f:metadata>
<ui:param name="thispage" value="page.product.create" /> <ui:param name="thispage" value="page.product.create" />
<ui:define name="content"> <ui:define name="content">
<tools:fatalPermission target="PRODUCT" permission="WRITE" /> <products:edit commitaction="#{productView.createProduct()}" commitvalue="#{i18n['products.create']}" />
<products:create />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:products="http://java.sun.com/jsf/composite/cditools/products"
>
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.product.edit" />
<ui:define name="content">
<products:manageDiscount commitaction="#{productView.createDiscount()}" commitvalue="#{i18n['discount.create']}" />
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -5,17 +5,19 @@ ...@@ -5,17 +5,19 @@
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:products="http://java.sun.com/jsf/composite/cditools/products">
xmlns:products="http://java.sun.com/jsf/composite/tools/products">
<h:head> <h:head>
<title></title> <title></title>
</h:head> </h:head>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
<f:viewParam name="productid" value="#{productView.productId}" />
<f:event type="preRenderView" listener="#{productView.initEditView}" />
</f:metadata>
<ui:param name="thispage" value="page.product.edit" /> <ui:param name="thispage" value="page.product.edit" />
<ui:define name="content"> <ui:define name="content">
<tools:fatalPermission target="PRODUCT" permission="WRITE" />
<products:edit commitaction="#{productView.saveProduct()}" <products:edit commitaction="#{productView.saveProduct()}"
commitvalue="#{i18n['products.save']}" /> commitvalue="#{i18n['products.save']}" />
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:tools="http://java.sun.com/jsf/composite/tools"> >
<h:head> <h:head>
<title></title> <title></title>
</h:head> </h:head>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.product.edit" /> <ui:param name="thispage" value="page.product.edit" />
<ui:define name="content"> <ui:define name="content">
<tools:fatalPermission target="PRODUCT" permission="WRITE" /> <products:manageDiscount commitaction="#{productView.save()}" commitvalue="#{i18n['discount.save']}" />
<h:form id="discountform">
<h:inputHidden name="#{productView.discount.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['discount.shortdesc']}:" />
<h:inputText value="#{productView.discount.shortdesc}" />
<h:outputLabel value="#{i18n['discount.percentage']}:" />
<h:inputText value="#{productView.discount.percentage}" />
<h:outputLabel value="#{i18n['discount.code']}:" />
<h:inputText value="#{productView.discount.code}" />
<h:outputLabel value="#{i18n['discount.amountMin']}:" />
<h:inputText value="#{productView.discount.amountMin}" />
<h:outputLabel value="#{i18n['discount.amountMax']}:" />
<h:inputText value="#{productView.discount.amountMax}" />
<h:outputLabel value="#{i18n['discount.maxNum']}:" />
<h:inputText value="#{productView.discount.maxNum}" />
<h:outputLabel value="#{i18n['discount.active']}" />
<h:selectBooleanCheckbox value="#{productView.discount.active}" />
<h:outputLabel value="#{i18n['discount.role']}:" />
<h:commandButton id="commitbtn" action="#{productView.saveDiscount()}"
value="#{i18n['discount.save']}" />
</h:panelGrid>
</h:form>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:products="http://java.sun.com/jsf/composite/cditools/products"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" >
xmlns:products="http://java.sun.com/jsf/composite/tools/products"
xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:f="http://java.sun.com/jsf/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
<f:event type="preRenderView" listener="#{productListView.initView}" />
</f:metadata>
<ui:param name="thispage" value="page.product.list" /> <ui:param name="thispage" value="page.product.list" />
<ui:define name="content"> <ui:define name="content">
<products:list /> <products:list />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<composite:interface>
<composite:attribute name="accountevents" required="true" />
</composite:interface>
<composite:implementation>
<h:form id="accountEventForm">
<h:dataTable border="1" id="ac" value="#{cc.attrs.accountevents}" var="ac">
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.productname']}" />
</f:facet>
<h:outputText value="#{ac.product.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.quantity']}" />
</f:facet>
<h:outputText value="#{ac.quantity}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.unitPrice']}" />
</f:facet>
<h:outputText value="#{ac.unitPrice}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.total']}" />
</f:facet>
<h:outputText value="#{ac.total}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.eventTime']}" />
</f:facet>
<h:outputText value="#{ac.eventTime.time}">
<f:convertDateTime type="both" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.delivered']}" />
</f:facet>
<h:outputText value="#{ac.delivered.time}">
<f:convertDateTime type="both" />
</h:outputText>
</h:column>
</h:dataTable>
</h:form>
</composite:implementation>
</html>
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
<composite:attribute name="target" required="true" />
<composite:facet name="errormessage" />
</composite:interface>
<composite:implementation>
<c:choose>
<c:when test='#{sessionHandler.canExecute(cc.attrs.target) }'>
<composite:insertChildren />
</c:when>
<c:otherwise>
<composite:renderFacet required="false" name="errormessage" />
</c:otherwise>
</c:choose>
</composite:implementation>
</html>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
<composite:attribute name="target" required="true" />
<composite:facet name="errormessage" />
</composite:interface>
<composite:implementation>
<c:choose>
<c:when test='#{sessionHandler.canRead(cc.attrs.target) }'>
<composite:insertChildren />
</c:when>
<c:otherwise>
<composite:renderFacet required="false" name="errormessage" />
</c:otherwise>
</c:choose>
</composite:implementation>
</html>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
<composite:attribute name="target" required="true" />
<composite:facet name="errormessage" />
</composite:interface>
<composite:implementation>
<c:choose>
<c:when test='#{sessionHandler.canWrite(cc.attrs.target) }'>
<composite:insertChildren />
</c:when>
<c:otherwise>
<composite:renderFacet required="false" name="errormessage" />
</c:otherwise>
</c:choose>
</composite:implementation>
</html>
\ No newline at end of file
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
<c:choose> <c:choose>
<c:when test="#{not empty cc.attrs.isOneliner}"> <c:when test="#{not empty cc.attrs.isOneliner}">
<h:inputText id="linelogin" value="#{authView.login}" /> <h:inputText styleClass="form" id="linelogin" value="#{authView.login}" />
<h:inputSecret id="linepwd" value="#{authView.password}" /> <h:inputSecret styleClass="form" id="linepwd" value="#{authView.password}" />
<h:commandButton id="onelinesubmit" action="#{authView.executeLogin()}" value="#{i18n['login.submit']}" /> <h:commandButton styleClass="button" id="onelinesubmit" action="#{authView.executeLogin()}" value="#{i18n['login.submit']}" />
</c:when> </c:when>
<c:otherwise> <c:otherwise>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!