Commit 22cfdbac by Juho Juopperi

Merge branch 'master' of codecrew.fi:bortal

Conflicts:
	code/LanBortalWeb/src/fi/insomnia/bortal/web/cdiview/map/MapManageView.java
	code/LanBortalWeb/src/fi/insomnia/bortal/web/cdiview/user/AuthView.java
2 parents 5d752d89 42a59ade
Showing with 1942 additions and 586 deletions
......@@ -4,10 +4,6 @@
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/LanBortalAuthModuleClient"/>
<classpathentry combineaccessrules="false" kind="src" path="/lib-AuthModule-depends"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1.2"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>
......@@ -7,7 +7,7 @@
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_05">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
......
......@@ -16,6 +16,11 @@
</arguments>
</buildCommand>
<buildCommand>
<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
......@@ -26,5 +31,6 @@
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
</natures>
</projectDescription>
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
version="3.1">
<display-name>LanBortalBeans</display-name>
<ejb-client-jar>LanBortalBeansClient.jar</ejb-client-jar>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<display-name>LanBortalBeans</display-name>
<ejb-client-jar>LanBortalBeansClient.jar</ejb-client-jar>
</ejb-jar>
\ No newline at end of file
......@@ -64,7 +64,7 @@ public class AccountEventBean implements AccountEventBeanLocal {
public void delete(AccountEvent account) {
AccountEvent acco = accountfacade.find(account.getId());
loggingbean.logMessage(SecurityLogType.accountEvent, permbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getLogin(), "'");
loggingbean.logMessage(SecurityLogType.accountEvent, permbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getUser().getLogin(), "'");
acco.getProduct().getAccountEvents().remove(acco);
if (acco.getBill() != null) {
acco.getBill().setAccountEvent(null);
......
package fi.insomnia.bortal.beans;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import javax.imageio.ImageIO;
import org.jbarcode.JBarcode;
import org.jbarcode.JBarcodeFactory;
import org.krysalis.barcode4j.BarcodeDimension;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.impl.datamatrix.DataMatrixBean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import com.pdfjet.A4;
import com.pdfjet.Image;
import com.pdfjet.ImageType;
import com.pdfjet.PDF;
import com.pdfjet.Page;
public class BarcodeBean {
public static InputStream getBarcode(String message) throws IOException {
// BarcodeGenerator bean = new DataMatrixBean();
BarcodeGenerator bean = new Code128Bean();
ByteArrayOutputStream out = new ByteArrayOutputStream();
// System.out.println("created: " + (new Date().getTime() - start));
BitmapCanvasProvider canvas = new BitmapCanvasProvider(
out, "image/png", 150, BufferedImage.TYPE_BYTE_BINARY, false, 0);
canvas.establishDimensions(new BarcodeDimension(200, 15));
bean.generateBarcode(canvas, message);
canvas.finish();
ByteArrayInputStream istream = new ByteArrayInputStream(out.toByteArray());
return istream;
}
public void barcode4j() throws FileNotFoundException, Exception {
long start = new Date().getTime();
File outFile = new File("/tmp/rairai2.pdf");
PDF pdf = new PDF(new FileOutputStream(outFile));
System.out.println("pre CreateCode: " + (new Date().getTime() - start));
BarcodeGenerator bean = new DataMatrixBean();
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.out.println("created: " + (new Date().getTime() - start));
BitmapCanvasProvider canvas = new BitmapCanvasProvider(
out, "image/png", 150, BufferedImage.TYPE_BYTE_BINARY, false, 0);
bean.generateBarcode(canvas, "Foobar Rairai");
canvas.finish();
ByteArrayInputStream istream = new ByteArrayInputStream(out.toByteArray());
Image img = new Image(pdf, istream, ImageType.PNG);
Page page = new Page(pdf, A4.PORTRAIT);
img.drawOn(page);
System.out.println("post draw: " + (new Date().getTime() - start));
pdf.flush();
System.out.println("post flush: " + (new Date().getTime() - start));
}
public String asdasd() throws FileNotFoundException, Exception {
long start = new Date().getTime();
JBarcode code = JBarcodeFactory.getInstance().createCode128();
System.out.println("pre CreateCode: " + (new Date().getTime() - start));
BufferedImage barcode = code.createBarcode("Foobar Rairai");
System.out.println("created: " + (new Date().getTime() - start));
ImageIO.write(barcode, "JPEG", new File("/tmp/rairai.jpeg"));
System.out.println("To File: " + (new Date().getTime() - start));
File out = new File("/tmp/rairai2.pdf");
PDF pdf = new PDF(new FileOutputStream(out));
System.out.println("Pre stream: " + (new Date().getTime() - start));
ByteArrayOutputStream jpegstream = new ByteArrayOutputStream();
ImageIO.write(barcode, "JPEG", jpegstream);
System.out.println("post stream: " + (new Date().getTime() - start));
ByteArrayInputStream istream = new ByteArrayInputStream(jpegstream.toByteArray());
System.out.println("post istream: " + (new Date().getTime() - start));
Page page = new Page(pdf, A4.PORTRAIT);
Image img = new Image(pdf, istream, ImageType.JPEG);
img.drawOn(page);
System.out.println("post draw: " + (new Date().getTime() - start));
pdf.flush();
System.out.println("post flush: " + (new Date().getTime() - start));
return "";
}
public static void main(String[] args) {
BarcodeBean bb = new BarcodeBean();
try {
bb.barcode4j();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
......@@ -27,7 +27,6 @@ import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.ProductFlag;
......@@ -73,6 +72,8 @@ public class BillBean implements BillBeanLocal {
private LoggingBeanLocal loggingBean;
@EJB
private EventUserFacade eventUserFacade;
@EJB
private ProductPBean productPBean;
/**
* Default constructor.
......@@ -88,7 +89,7 @@ public class BillBean implements BillBeanLocal {
return null;
}
Bill bill = billFacade.find(id);
IUser currentuser = permbean.getCurrentUser();
EventUser currentuser = permbean.getCurrentUser();
logger.debug("bill {} user {}", bill, currentuser);
if (bill != null && !currentuser.equals(bill.getUser()) && !permbean.hasPermission(BillPermission.READ_ALL)) {
......@@ -239,7 +240,7 @@ public class BillBean implements BillBeanLocal {
placebean.lockPlaceProduct(bill.getUser(), prod, bl.getQuantity());
}
AccountEvent ac2 = productBean.createAccountEvent(prod, bl.getQuantity(), user, bill.getSentDate());
AccountEvent ac2 = productPBean.createAccountEvent(prod, bl.getQuantity(), user, bill.getSentDate());
logger.info("Created ac from product. {}, userproducts {}", ac2, user.getAccountEvents().size());
ac2.setSeller(permbean.getCurrentUser());
......@@ -249,7 +250,7 @@ public class BillBean implements BillBeanLocal {
MailMessage msg = new MailMessage();
msg.setSubject(I18n.get("bill.billMarkedPaidMail.subject"));
msg.setMessage(I18n.get("bill.billMarkedPaidMail.message", (bill.getBillNumber() == null) ? "----" : bill.getBillNumber().toString()));
msg.setTo(bill.getUser());
msg.setTo(bill.getUser().getUser());
utilbean.sendMail(msg);
eventUserFacade.flush();
eventUserFacade.evict(bill.getUser());
......@@ -281,7 +282,4 @@ public class BillBean implements BillBeanLocal {
return billFacade.find(user);
}
public void findByOrdernumber() {
}
}
......@@ -154,7 +154,7 @@ public class CardTemplateBean implements CardTemplateBeanLocal {
// user.getPrintedCards().add(pc);
printedcardfacade.create(pc);
biggestCard = pc;
logger.info("User {} has too little power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower });
logger.info("User {} has too little power old role {} New role {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
} else if (existingPower > newPower) {
MailMessage msg = new MailMessage();
LanEventProperty value = eventPropertyFacade.find(eventBean.getCurrentEvent(), LanEventPropertyKey.ADMIN_MAIL);
......@@ -164,13 +164,13 @@ public class CardTemplateBean implements CardTemplateBeanLocal {
msg.setFromAddress(value.getTextvalue());
msg.setFromName("Lippukauppa");
msg.setToAddress(value.getTextvalue());
msg.setSubject("User " + user.getLogin() + " has too powerful card!");
msg.setMessage("User ", user.getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa");
msg.setSubject("User " + user.getUser().getLogin() + " has too powerful card!");
msg.setMessage("User ", user.getUser().getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa");
mailbean.sendMail(msg);
logger.info("User {} has too much power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower });
logger.info("User {} has too much power old role {} New role {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
}
} else {
logger.info("User {} has power {} and roles has power {}", new Object[] { user.getLogin(), existingPower, newPower });
logger.info("User {} has power {} and roles has power {}", new Object[] { user.getUser().getLogin(), existingPower, newPower });
}
return biggestCard;
......
......@@ -51,34 +51,51 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
EventUser eventUser = eventUserFacade.findByLogin(username.trim());
User user = null;
// Might not have EventUser
if (eventUser == null) {
User user = userfacade.findByLogin(username.trim());
if (user != null) {
eventUser = new EventUser(user, eventbean.getCurrentEvent());
eventUserFacade.merge(eventUser);
}
user = userfacade.findByLogin(username.trim());
} else {
user = eventUser.getUser();
}
EventUser ret = null;
if (eventUser != null) {
if (eventUser.isAnonymous()) {
if (user != null) {
if (user.isAnonymous()) {
logger.info("logging in as anonymous!!!");
ret = eventUser;
} else if (eventUser.checkPassword(password)) {
ret = eventUser;
} else {
secubean.logMessage(SecurityLogType.permissionDenied, eventUser.getUser(), "Login failed: wrong password for username ", username);
} else if (!user.checkPassword(password)) {
secubean.logMessage(SecurityLogType.permissionDenied, eventUser, "Login failed: wrong password for username ", username);
eventUser = null;
user = null;
}
if (user != null && eventUser == null)
{
LanEvent event = eventbean.getCurrentEvent();
eventUser = new EventUser(user, event, null);
// eventUser.setCreator(eventUser);
eventUserFacade.create(eventUser);
eventUserFacade.flush();
eventUser.setCreator(eventUser);
}
} else {
secubean.logMessage(SecurityLogType.permissionDenied, (User) null, "Login failed: Username not found: ", username);
secubean.logMessage(SecurityLogType.permissionDenied, eventbean.getCurrentEvent(), null, "Login failed: Username not found: ", username);
}
return ret;
return eventUser;
}
// public static void foo()
// {
// if (user != null) {
// LanEvent event = eventbean.getCurrentEvent();
// eventUser = new EventUser(user, event, null);
// // eventUser.setCreator(eventUser);
// eventUserFacade.create(eventUser);
// eventUserFacade.flush();
// eventUser.setCreator(eventUser);
// }
// }
@Override
public boolean authenticate(String username, String password) {
boolean ret = (tryLogin(username, password) != null);
......@@ -101,12 +118,12 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
roleset.add(SpecialPermission.ANONYMOUS.name());
}
if (!usr.isAnonymous()) {
if (!usr.getUser().isAnonymous()) {
roleset.add(SpecialPermission.USER.name());
}
// TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!!
if (usr.isSuperadmin()) {
if (usr.getUser().isSuperadmin()) {
for (BortalApplication app : BortalApplication.values()) {
for (IAppPermission perm : app.getPermissions()) {
roleset.add(perm.getFullName());
......@@ -123,7 +140,7 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
}
LanEvent event = eventbean.getCurrentEvent();
if (event != null && !usr.isAnonymous() && event.getDefaultRole() != null) {
if (event != null && !usr.getUser().isAnonymous() && event.getDefaultRole() != null) {
for (ApplicationPermission apperm : event.getDefaultRole().getPermissions()) {
roleset.add(apperm.getPermission().getFullName());
}
......
......@@ -14,6 +14,7 @@ import org.slf4j.Logger;
import fi.insomnia.bortal.facade.LogEntryFacade;
import fi.insomnia.bortal.facade.LogEntryTypeFacade;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LogEntry;
import fi.insomnia.bortal.model.LogEntryType;
import fi.insomnia.bortal.model.User;
......@@ -33,6 +34,8 @@ public class LoggingBean implements LoggingBeanLocal {
private LogEntryTypeFacade typeFacade;
@EJB
private LogEntryFacade entryFacade;
@EJB
private EventBeanLocal eventbean;
@Resource
UserTransaction utx;
......@@ -86,14 +89,19 @@ public class LoggingBean implements LoggingBeanLocal {
// }
@Override
public LogEntry logMessage(SecurityLogType paramType, User user,
String... description) {
public LogEntry logMessage(SecurityLogType paramType, LanEvent event, User user,
Object... description) {
LogEntry entry = null;
if (event == null)
{
event = eventbean.getCurrentEvent();
}
try {
String desc = toString(description);
utx.begin();
LogEntryType type = typeFacade.findOrCreate(paramType);
entry = new LogEntry(Calendar.getInstance());
entry.setParentEvent(event);
entry.setType(type);
entry.setDescription(desc);
entry.setUser(user);
......@@ -113,14 +121,20 @@ public class LoggingBean implements LoggingBeanLocal {
}
@Override
public LogEntry logMessage(SecurityLogType paramType, EventUser user,
String... description) {
return logMessage(paramType, user.getUser(), description);
public LogEntry logMessage(SecurityLogType paramType, EventUser user, Object... description) {
LanEvent event = null;
User usr = null;
if (user != null)
{
event = user.getEvent();
usr = user.getUser();
}
return logMessage(paramType, event, usr, description);
}
private static final String toString(String... desc) {
private static final String toString(Object... desc) {
StringBuilder msg = new StringBuilder();
for (String msgpart : desc) {
for (Object msgpart : desc) {
msg.append(msgpart);
}
return msg.toString();
......
......@@ -77,7 +77,7 @@ public class Menubean implements MenubeanLocal {
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/logout"), null).setVisible(false);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/logoutResponse"), null).setVisible(false);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/resetPassword"), null).setVisible(false);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/resetMailSent"), null).setVisible(false);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/resetmailSent"), null).setVisible(false);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/passwordChanged"), null).setVisible(false);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/notauthorized"), null).setVisible(false);
......@@ -104,6 +104,10 @@ public class Menubean implements MenubeanLocal {
shopTopmenu.addPage(menuitemfacade.findOrCreate("/svm/notification"), null).setVisible(false);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/svm/pending"), null).setVisible(false);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/svm/success"), null).setVisible(false);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/checkout/cancel"), null).setVisible(false);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/checkout/delayed"), null).setVisible(false);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/checkout/reject"), null).setVisible(false);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/checkout/return"), null).setVisible(false);
MenuNavigation pollTopmenu = usernavi.addPage(null, null);
pollTopmenu.setKey("topnavi.poll");
......@@ -140,9 +144,9 @@ public class Menubean implements MenubeanLocal {
adminuser.addPage(menuitemfacade.findOrCreate("/place/adminInsertToken"), UserPermission.VIEW_ALL).setVisible(false);
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/sendPicture"), UserPermission.VIEW_ALL).setVisible(false);
MenuNavigation initUser = adminnavi.addPage(null, null);
initUser.setKey("topnavi.userinit");
initUser.addPage(menuitemfacade.findOrCreate("/useradmin/validateUser"), UserPermission.VIEW_ALL);
// MenuNavigation initUser = adminnavi.addPage(null, null);
// initUser.setKey("topnavi.userinit");
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/validateUser"), UserPermission.VIEW_ALL);
MenuNavigation usershop = adminnavi.addPage(null, null);
usershop.setKey("topnavi.adminshop");
......
......@@ -26,7 +26,6 @@ import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.User;
@Stateless
......@@ -157,14 +156,19 @@ public class PermissionBean implements PermissionBeanLocal {
// }
@Override
public boolean isCurrentUser(IUser user) {
public boolean isCurrentUser(User user) {
return (context.getCallerPrincipal() == null || user == null) ? false : context.getCallerPrincipal().getName().equals(user.getLogin());
}
@Override
public boolean isCurrentUser(EventUser user) {
return user != null && isCurrentUser(user.getUser());
}
@Override
public boolean isLoggedIn() {
return !getAnonEventUser().equals(getCurrentUser()) || getCurrentUser().isSuperadmin();
return !getAnonEventUser().equals(getCurrentUser()) || getCurrentUser().getUser().isSuperadmin();
}
@Override
......@@ -189,12 +193,12 @@ public class PermissionBean implements PermissionBeanLocal {
User user = userfacade.findByLogin(User.ANONYMOUS_LOGINNAME);
if (user == null)
{
defaultUser = new EventUser(new User(), eventbean.getCurrentEvent());
defaultUser.setLogin(User.ANONYMOUS_LOGINNAME);
defaultUser.setNick(User.ANONYMOUS_LOGINNAME);
defaultUser = new EventUser(new User(), eventbean.getCurrentEvent(), null);
defaultUser.getUser().setLogin(User.ANONYMOUS_LOGINNAME);
defaultUser.getUser().setNick(User.ANONYMOUS_LOGINNAME);
} else {
defaultUser = new EventUser(user, eventbean.getCurrentEvent());
defaultUser = new EventUser(user, eventbean.getCurrentEvent(), null);
}
eventUserFacade.create(defaultUser);
eventUserFacade.flush();
......
......@@ -5,6 +5,7 @@
package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
......@@ -41,7 +42,6 @@ import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
......@@ -54,9 +54,11 @@ import fi.insomnia.bortal.model.ProductFlag;
*/
@Stateless
@LocalBean
@DeclareRoles({ MapPermission.S_BUY_PLACES,
@DeclareRoles({
MapPermission.S_BUY_PLACES,
MapPermission.S_MANAGE_MAPS,
MapPermission.S_VIEW,
MapPermission.S_MANAGE_OTHERS,
})
public class PlaceBean implements PlaceBeanLocal {
private static final String PLACE_RESERVE_TIMEOUTER = "Map reserve timeouter";
......@@ -94,6 +96,8 @@ public class PlaceBean implements PlaceBeanLocal {
private AccountEventBeanLocal acbean;
@EJB
private PlaceGroupFacade pgfacade;
@EJB
private ProductPBean productPBean;
@Override
@RolesAllowed(MapPermission.S_MANAGE_MAPS)
......@@ -232,12 +236,12 @@ public class PlaceBean implements PlaceBeanLocal {
// }
@Override
@RolesAllowed(MapPermission.S_BUY_PLACES)
@RolesAllowed({ MapPermission.S_BUY_PLACES, MapPermission.S_MANAGE_OTHERS })
public PlaceGroup buySelectedPlaces(EventUser user) throws BortalCatchableException {
if (user == null) {
user = permbean.getCurrentUser();
} else {
if (!user.equals(permbean.getCurrentUser())) {
if (!user.equals(permbean.getCurrentUser()) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
loggerbean.logMessage(SecurityLogType.permissionDenied, permbean.getCurrentUser(), "Can not buy places for user " + user);
throw new EJBAccessException("Not enough permissions to buy place");
}
......@@ -254,13 +258,13 @@ public class PlaceBean implements PlaceBeanLocal {
BigDecimal totalprice = addAndCalcPrice(user, null);
BigDecimal balance = user.getAccountBalance();
if (balance.compareTo(totalprice) < 0) {
if (balance.compareTo(totalprice) < 0 && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
logger.info("User {} Could not buy things because account balance {} is too low for purchase {}", new Object[] { user, balance, totalprice });
return null;
}
for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) {
productBean.createAccountEvent(line.getKey(), new BigDecimal(line.getValue()), user);
productPBean.createAccountEvent(line.getKey(), new BigDecimal(line.getValue()), user, Calendar.getInstance());
}
PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
......@@ -275,8 +279,8 @@ public class PlaceBean implements PlaceBeanLocal {
if (!p.isReservedFor(user)) {
throw new BortalCatchableException("Trying to buy place not reserved for that user");
}
logger.info("Buying place {} for user {}", p.getName(), user.getLogin());
GroupMembership gm = buy(p, pg, user);
logger.info("Buying place {} for user {}", p.getName(), user.getUser().getLogin());
GroupMembership gm = buy(p, pg);
if (!associatedToPlace)
{
logger.info("Associating buyer {} to place {}", user, gm);
......@@ -326,7 +330,7 @@ public class PlaceBean implements PlaceBeanLocal {
if (freePlace == null) {
throw new EJBException("Could find a place to be reserved....");
}
GroupMembership gm = buy(freePlace, pg, user);
GroupMembership gm = buy(freePlace, pg);
if (!associatedToPlace)
{
logger.info("Associating buyer {} to place {}", user, gm);
......@@ -349,7 +353,7 @@ public class PlaceBean implements PlaceBeanLocal {
return ret;
}
private GroupMembership buy(Place p, PlaceGroup pg, IUser user) {
private GroupMembership buy(Place p, PlaceGroup pg) {
p.setGroup(pg);
p.setReleaseTime(null);
// Current user temporarily used at place reservation. When buying
......@@ -358,6 +362,13 @@ public class PlaceBean implements PlaceBeanLocal {
GroupMembership membership = new GroupMembership(pg, p, gmemfacade.createInviteToken());
pg.getMembers().add(membership);
p.setPlaceReserver(membership);
if (pg.getPlaces() == null) {
pg.setPlaces(new ArrayList<Place>());
}
if (!pg.getPlaces().contains(p))
{
pg.getPlaces().add(p);
}
return membership;
}
......@@ -451,7 +462,7 @@ public class PlaceBean implements PlaceBeanLocal {
@RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean releasePlace(Place place) {
place = placeFacade.find(place.getId());
IUser user = permbean.getCurrentUser();
EventUser user = permbean.getCurrentUser();
if (place.getGroup() != null || place.getCurrentUser() == null || (!permbean.hasPermission(MapPermission.MANAGE_OTHERS) && !place.getCurrentUser().equals(user))) {
return false;
}
......
......@@ -23,11 +23,14 @@ import com.pdfjet.TextLine;
import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.PlaceGroupFacade;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.BarcodeUtils;
/**
* Session Bean implementation class PlaceGroupBean
......@@ -52,6 +55,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
private LoggingBeanLocal loggerbean;
@EJB
private PlaceGroupFacade pgfacade;
@EJB
private EventUserFacade eventuserfacade;
/**
* Default constructor.
......@@ -101,17 +106,18 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
@Override
@RolesAllowed(MapPermission.S_BUY_PLACES)
public boolean associateToToken(EventUser user, String token) {
user = eventuserfacade.reload(user);
if (!permbean.isCurrentUser(user) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
throw new EJBAccessException();
}
token = token.trim();
GroupMembership mem = gmemfacade.findByToken(token);
boolean ret = false;
if (mem != null && mem.getUser() == null) {
mem.setUser(user);
gmemfacade.merge(mem);
// gmemfacade.merge(mem);
ret = true;
}
......@@ -143,7 +149,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
// PNGImage(BarcodeBean.getBarcode(membership.getInviteToken()));
// logger.debug("Jpeg: " + jpeg.getWidth() + " h. " +
// jpeg.getHeight());
Image image = new Image(pdf, BarcodeBean.getBarcode(membership.getInviteToken()), ImageType.PNG);
Image image = new Image(pdf, BarcodeUtils.getBarcode(membership.getInviteToken()), ImageType.PNG);
image.scaleBy(0.8);
image.setPosition(50, y);
image.drawOn(page);
......@@ -164,7 +170,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
reserverLabel.setPosition(300, y + 30);
reserverLabel.drawOn(page);
TextLine reserver = new TextLine(font, new StringBuilder(membership.getPlaceGroup().getCreator().getWholeName()).append(" (").append(membership.getPlaceGroup().getCreator().getNick()).append(")").toString());
User creator = membership.getPlaceGroup().getCreator().getUser();
TextLine reserver = new TextLine(font, new StringBuilder(creator.getWholeName()).append(" (").append(creator.getNick()).append(")").toString());
reserver.setPosition(310, y + 45);
reserver.drawOn(page);
......@@ -172,7 +179,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
assoclabel.setPosition(300, y + 65);
assoclabel.drawOn(page);
TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getWholeName()).append(" (").append(membership.getUser().getNick()).append(")").toString()));
TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getUser().getWholeName()).append(" (").append(membership.getUser().getUser().getNick()).append(")").toString()));
assoc.setPosition(310, y + 80);
assoc.drawOn(page);
......
......@@ -2,9 +2,11 @@ package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
......@@ -12,19 +14,25 @@ import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.bortal.views.BillSummary;
import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.facade.BillLineFacade;
import fi.insomnia.bortal.facade.DiscountFacade;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.facade.ProductFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Discount;
import fi.insomnia.bortal.model.DiscountInstance;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.ProductFlag;
import fi.insomnia.bortal.model.ProductLimitation;
import fi.insomnia.bortal.model.Role;
/**
* Session Bean implementation class ProductBean
......@@ -59,6 +67,19 @@ public class ProductBean implements ProductBeanLocal {
private PermissionBeanLocal permbean;
@EJB
private EventUserFacade eventUserFacade;
@EJB
private UserBeanLocal userbean;
@EJB
private BillBeanLocal billbean;
@EJB
private EventBeanLocal eventbean;
@EJB
private BillLineFacade billLineFacade;
@EJB
private ProductPBean productPBean;
private static final Logger logger = LoggerFactory.getLogger(ProductBean.class);
/**
* Default constructor.
......@@ -109,6 +130,139 @@ public class ProductBean implements ProductBeanLocal {
return retProd;
}
/**
* TODO: This is not enforced!!!
*
* @param product
* Product to find limits for
* @return How many products can still be bought. NULL if no limit.
*/
@Override
public HashMap<Integer, BigDecimal> getProductLimit(Map<Integer, BigDecimal> prodCounts, EventUser user)
{
HashMap<Integer, BigDecimal> ret = new HashMap<Integer, BigDecimal>();
for (Entry<Integer, BigDecimal> pc : prodCounts.entrySet())
{
Product prod = productFacade.find(pc.getKey());
BigDecimal lim = getProductLimit(prod, user, prodCounts);
ret.put(prod.getId(), lim);
// logger.info("Added product limit {} to {}", lim, prod);
}
System.out.println(ret);
return ret;
}
@Override
public BigDecimal getProductLimit(Product product, EventUser user, Map<Integer, BigDecimal> prodCounts)
{
product = productFacade.reload(product);
List<Role> userroles = userbean.findUsersRoles(user);
BigDecimal ret = null;
if (product != null && product.getProductLimits() != null)
{
for (ProductLimitation limit : product.getProductLimits())
{
BigDecimal currentCount = BigDecimal.ZERO;
for (Product p : limit.getProducts())
{
currentCount = currentCount.add(prodCounts.get(p.getId()));
}
// logger.info("Got limit {} for product {}", limit, product);
if (limit.getMatchingRoles() != null && !limit.getMatchingRoles().isEmpty())
{
boolean roleMatched = false;
for (Role mr : limit.getMatchingRoles()) {
if (userroles.contains(mr)) {
roleMatched = true;
break;
}
}
if (!roleMatched) {
continue;
}
}
BigDecimal count = currentCount;
switch (limit.getType())
{
case GLOBAL_BILLED:
BigDecimal globBillTot = BigDecimal.ZERO;
for (Product p : limit.getProducts())
{
BillSummary globBilledSummary = billLineFacade.getLineSummary(p, eventbean.getCurrentEvent());
globBillTot = globBillTot.add(globBilledSummary.getTotal());
}
count = count.add(globBillTot);
ret = limit.getUpperLimit().subtract(count);
break;
case GLOBAL_BILL_PAID:
BigDecimal globBillPaid = BigDecimal.ZERO;
for (Product p : limit.getProducts())
{
BillSummary billPaidSummary = billLineFacade.getLineSummary(p, eventbean.getCurrentEvent());
globBillPaid = globBillPaid.add(billPaidSummary.getPaid());
}
count = count.add(globBillPaid);
ret = limit.getUpperLimit().subtract(count);
break;
case GLOBAL_ACCOUNTEVENTS:
BigDecimal globalProductCount = accounteventfacade.getProductCount(limit.getProducts());
if (globalProductCount != null) {
count = count.add(globalProductCount);
}
ret = limit.getUpperLimit().subtract(count);
break;
case USER_ACCOUNTEVENTS:
BigDecimal userProductCount = accounteventfacade.getProductCount(limit.getProducts(), user);
if (userProductCount != null)
{
count = count.add(userProductCount);
}
ret = limit.getUpperLimit().subtract(count);
break;
case USER_BILLED:
BigDecimal userBillTot = BigDecimal.ZERO;
for (Product p : limit.getProducts())
{
BillSummary userBilledSummary = billLineFacade.getLineSummary(p, eventbean.getCurrentEvent(), user);
userBillTot = userBillTot.add(userBilledSummary.getTotal());
}
count = count.add(userBillTot);
ret = limit.getUpperLimit().subtract(count);
break;
case USER_BILL_PAID:
BigDecimal userBillPaid = BigDecimal.ZERO;
for (Product p : limit.getProducts())
{
BillSummary userPaidSummary = billLineFacade.getLineSummary(p, eventbean.getCurrentEvent(), user);
userBillPaid = userBillPaid.add(userPaidSummary.getPaid());
}
count = count.add(userBillPaid);
ret = limit.getUpperLimit().subtract(count);
break;
default:
break;
}
if (ret != null)
{
// logger.warn("breaking for value {}, product {}", ret,
// product);
break;
}
}
}
return ret;
}
@Override
public BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date) {
if (product == null || quantity == null) {
......@@ -136,36 +290,6 @@ public class ProductBean implements ProductBeanLocal {
// return ret;
// }
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Calendar date) {
BigDecimal unitPrice = product.getPrice().negate();
List<Discount> discounts = product.getActiveDiscounts(quantity, date);
for (Discount d : discounts) {
unitPrice = unitPrice.multiply(d.getPercentage());
}
AccountEvent ret = new AccountEvent(user, product, unitPrice, quantity, Calendar.getInstance());
ret.setDelivered(Calendar.getInstance());
ret.setSeller(permbean.getCurrentUser());
List<DiscountInstance> accEventdiscounts = ret.getDiscountInstances();
for (Discount d : discounts) {
// discountsArray.add(discInst);
// discountinstancefacade.create(discInst);
accEventdiscounts.add(new DiscountInstance(ret, d));
}
if (user.getAccountEvents() == null) {
user.setAccountEvents(new ArrayList<AccountEvent>());
}
user.getAccountEvents().add(ret);
accounteventfacade.create(ret);
// flush changes to db.
// userFacade.flush();
return ret;
}
@Override
public Product findById(int id) {
Product ret = productFacade.find(id);
......@@ -200,6 +324,15 @@ public class ProductBean implements ProductBeanLocal {
@Override
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user) {
return createAccountEvent(product, quantity, user, Calendar.getInstance());
user = eventUserFacade.reload(user);
AccountEvent ret = productPBean.createAccountEvent(product, quantity, user, Calendar.getInstance());
return ret;
}
@Override
// @RolesAllowed(ShopPermission.S_LIST_ALL_PRODUCTS)
public Product findByBarcode(String barcode) {
return productFacade.findProductByBarcode(barcode);
}
}
package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Discount;
import fi.insomnia.bortal.model.DiscountInstance;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.Product;
/**
* Session Bean implementation class ProductPBean
*/
@Stateless
@LocalBean
public class ProductPBean {
@EJB
private PermissionBean permbean;
private AccountEventFacade accounteventfacade;
/**
* Default constructor.
*/
public ProductPBean() {
// TODO Auto-generated constructor stub
}
/**
* Creates new AccountEvent from provided product to provided user <br>
* <strong>Notice</strong>, that this function expects the user parameter to
* be attached entity!
*
* @param product
* Product to create the account event from
* @param quantity
* How many products have been bought
* @param user
* user to whom the product should be created. MUST BE ATTACHED
* ENTITY!
* @param date
* AccountEvent creation time
* @return The created AccountEvent entity
*/
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Calendar date) {
BigDecimal unitPrice = product.getPrice().negate();
List<Discount> discounts = product.getActiveDiscounts(quantity, date);
for (Discount d : discounts) {
unitPrice = unitPrice.multiply(d.getPercentage());
}
AccountEvent ret = new AccountEvent(user, product, unitPrice, quantity, Calendar.getInstance());
ret.setDelivered(Calendar.getInstance());
ret.setSeller(permbean.getCurrentUser());
List<DiscountInstance> accEventdiscounts = ret.getDiscountInstances();
for (Discount d : discounts) {
// discountsArray.add(discInst);
// discountinstancefacade.create(discInst);
accEventdiscounts.add(new DiscountInstance(ret, d));
}
if (user.getAccountEvents() == null) {
user.setAccountEvents(new ArrayList<AccountEvent>());
}
user.getAccountEvents().add(ret);
accounteventfacade.create(ret);
// flush changes to db.
// userFacade.flush();
return ret;
}
}
......@@ -131,4 +131,11 @@ public class SitePageBean implements SitePageBeanLocal {
SitePage page = sitepagefacade.find(name);
return getContentsForPage(page);
}
@Override
@RolesAllowed(ContentPermission.S_MANAGE_PAGES)
public SitePage findSitename(String managedPage) {
return sitepagefacade.find(managedPage);
}
}
......@@ -103,7 +103,7 @@ public class TestDataBean implements TestDataBeanLocal {
u.setNick("kavija");
Calendar bday = Calendar.getInstance();
bday.set(Calendar.YEAR, 1990);
u.setBirthday(bday);
u.setBirthday(bday.getTime());
u.setCreated(Calendar.getInstance());
u.setEmail("kalle.kavija@example.com");
u.setFirstnames("Kalle Kauko");
......@@ -129,7 +129,7 @@ public class TestDataBean implements TestDataBeanLocal {
u.setNick("admin");
Calendar bday = Calendar.getInstance();
bday.set(Calendar.YEAR, 1980);
u.setBirthday(bday);
u.setBirthday(bday.getTime());
u.setCreated(Calendar.getInstance());
u.setEmail("admin@inter.net");
u.setFirstnames("Asko Admin");
......
......@@ -46,6 +46,7 @@ import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
/**
......@@ -205,10 +206,10 @@ public class UserBean implements UserBeanLocal {
userimage.setName(filename);
userimage.setDescription(description);
user.getUserImageList().add(userimage);
user.getUser().getUserImageList().add(userimage);
// setting uploaded image as the default.
user.setCurrentImage(userimage);
user.getUser().setCurrentImage(userimage);
return userimage;
}
......@@ -224,7 +225,7 @@ public class UserBean implements UserBeanLocal {
UserImage ret = null;
if (id == 0 && permbean.isLoggedIn()) {
ret = permbean.getCurrentUser().getCurrentImage();
ret = permbean.getCurrentUser().getUser().getCurrentImage();
} else {
ret = userimagefacade.find(id);
if (ret != null && !permbean.isCurrentUser(ret.getUser()) && permbean.hasPermission(UserPermission.MODIFY)) {
......@@ -245,7 +246,8 @@ public class UserBean implements UserBeanLocal {
@RolesAllowed(UserPermission.S_CREATE_NEW)
public void createNewUser(EventUser user, String password) {
user.resetPassword(password);
user.getUser().resetPassword(password);
// todo add barcode
user.setEvent(eventBean.getCurrentEvent());
// Tallennetaan olio kantaan...
eventUserFacade.create(user);
......@@ -309,8 +311,8 @@ public class UserBean implements UserBeanLocal {
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public SearchResult<User> getUsers(int page, int pagesize, String sort, String search) {
return userFacade.searchUser(page, pagesize, sort, search);
public SearchResult<User> getUsers(SearchQuery search) {
return userFacade.searchAllUsers(search);
}
// @Override
......@@ -337,7 +339,7 @@ public class UserBean implements UserBeanLocal {
MailMessage msg = new MailMessage();
msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT));
msg.setMessage(MessageFormat.format(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_CONTENT), MessageFormat.format(url, token), creator.getWholeName()));
msg.setMessage(MessageFormat.format(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_CONTENT), MessageFormat.format(url, token), creator.getUser().getWholeName()));
msg.setToAddress(invitemail);
utilbean.sendMail(msg);
return true;
......@@ -420,7 +422,7 @@ public class UserBean implements UserBeanLocal {
@Override
@RolesAllowed(UserPermission.S_CREATE_NEW)
public EventUser createNewUser(User usr) {
EventUser evu = new EventUser(usr, eventBean.getCurrentEvent());
EventUser evu = new EventUser(usr, eventBean.getCurrentEvent(), permbean.getCurrentUser());
eventUserFacade.create(evu);
return evu;
}
......@@ -458,7 +460,7 @@ public class UserBean implements UserBeanLocal {
EventUser ret = eventUserFacade.find(user);
if (ret == null)
{
ret = new EventUser(user, eventBean.getCurrentEvent());
ret = new EventUser(user, eventBean.getCurrentEvent(), permbean.getCurrentUser());
eventUserFacade.create(ret);
eventUserFacade.flush();
}
......@@ -489,4 +491,22 @@ public class UserBean implements UserBeanLocal {
}
}
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public EventUser getUserByBarcode(String barcode) {
EventUser user = eventUserFacade.findByBarcode(barcode);
return user;
}
@Override
public SearchResult<User> getEventUsers(SearchQuery search) {
if (search.getSearch() == null || search.getSearch().isEmpty())
{
return userFacade.searchEventUsers(search);
} else {
return userFacade.searchAllUsers(search);
}
}
}
\ No newline at end of file
......@@ -36,16 +36,16 @@ public class UserUtilBean implements UserUtilBeanLocal {
@Override
public void convertUsernames() {
for (EventUser u : userbean.getUsers()) {
if (u.getLogin().trim().isEmpty()) {
if (u.getUser().getLogin().trim().isEmpty()) {
logger.warn("User {} has empty login...");
continue;
}
User testU = userfacade.findByLogin(u.getLogin().toLowerCase());
User testU = userfacade.findByLogin(u.getUser().getLogin().toLowerCase());
if (testU == null || testU.equals(u)) {
u.setLogin(u.getLogin().toLowerCase());
logger.info("Converted user {}", u.getLogin());
u.getUser().setLogin(u.getUser().getLogin().toLowerCase());
logger.info("Converted user {}", u.getUser().getLogin());
} else {
logger.warn("Could not convert user {}", u.getLogin(), testU.getLogin());
logger.warn("Could not convert user {}", u.getUser().getLogin(), testU.getLogin());
}
}
......
......@@ -4,8 +4,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
......@@ -22,14 +20,12 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.codec.binary.Hex;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.auth.params.AuthPNames;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.AuthPolicy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -47,6 +43,7 @@ import fi.insomnia.bortal.model.LanEventPrivateProperty;
import fi.insomnia.bortal.model.LanEventPrivatePropertyKey;
import fi.insomnia.bortal.util.SvmReturnType;
import fi.insomnia.bortal.util.VerkkomaksutReturnEntry;
import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.verkkomaksutfi.PaymentEntry;
/**
......@@ -58,7 +55,7 @@ import fi.insomnia.bortal.verkkomaksutfi.PaymentEntry;
public class VerkkomaksutFiBean implements VerkkomaksutFiBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(VerkkomaksutFiBean.class);
private static final char CHECKSUM_SEP = '|';
private static final String CHECKSUM_SEP = "|";
@EJB
private EventBean eventbean;
@EJB
......@@ -92,45 +89,40 @@ public class VerkkomaksutFiBean implements VerkkomaksutFiBeanLocal {
}
String merchantPassword = eventbean.getPrivatePropertyString(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_PASSWORD);
StringBuilder sumSource = new StringBuilder().append(orderNumber).append(CHECKSUM_SEP)
.append(timestamp).append(CHECKSUM_SEP)
.append(paid).append(CHECKSUM_SEP)
.append(method).append(CHECKSUM_SEP)
.append(merchantPassword);
boolean ret = false;
try {
MessageDigest algo = MessageDigest.getInstance("MD5");
final byte[] resultByte = algo.digest(sumSource.toString().getBytes());
final String calculatedHash = new String(Hex.encodeHex(resultByte));
logger.info("calculated checksum for svv message: {}, comparing to {}", calculatedHash, authcode);
if (authcode.toUpperCase().equals(calculatedHash.toUpperCase())) {
Bill bill = billFacade.find(Integer.parseInt(orderNumber));
if (bill != null)
{
// If bill is unpaid, mark it paid...
if (SvmReturnType.PENDING.equals(type) || paid.equals("0000000000")) {
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Received pending message ", orderNumber, " bill ", bill == null ? "null" : bill.toString(), " with authcode: ", authcode);
} else if (bill.getAccountEvent() == null
&& bill.getPaidDate() == null
&& (SvmReturnType.NOTIFICATION.equals(type) || SvmReturnType.SUCCESS.equals(type))) {
vmrunner.markPaid(bill, Calendar.getInstance());
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Validated order number ", orderNumber, " bill ", bill == null ? "null" : bill.toString(), " with authcode: ", authcode);
ret = true;
} else {
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Bill already marked paid or other error. ", orderNumber, " bill ", bill == null ? "null" : bill.toString(), " with authcode: ", authcode);
ret = true;
}
String calculatedHash = PasswordFunctions.calculateMd5(CHECKSUM_SEP,
orderNumber,
timestamp,
paid,
method,
merchantPassword);
logger.info("calculated checksum for svv message: {}, comparing to {}", calculatedHash, authcode);
if (authcode.toUpperCase().equals(calculatedHash)) {
Bill bill = billFacade.find(Integer.parseInt(orderNumber));
if (bill != null)
{
// If bill is unpaid, mark it paid...
if (SvmReturnType.PENDING.equals(type) || paid.equals("0000000000")) {
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Received pending message ", orderNumber, " bill ", bill == null ? "null" : bill.toString(), " with authcode: ", authcode);
} else if (bill.getAccountEvent() == null
&& bill.getPaidDate() == null
&& (SvmReturnType.NOTIFICATION.equals(type) || SvmReturnType.SUCCESS.equals(type))) {
vmrunner.markPaid(bill, Calendar.getInstance());
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Validated order number ", orderNumber, " bill ", bill == null ? "null" : bill.toString(), " with authcode: ", authcode);
ret = true;
} else {
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Unable to find bill for order number ", orderNumber);
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Bill already marked paid or other error. ", orderNumber, " bill ", bill.toString(), " with authcode: ", authcode);
ret = true;
}
} else {
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Unable to validate order number: ", orderNumber, " calculated checksum: ", calculatedHash, " authcode ", authcode, " paid ", paid, " method ", method);
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Mac validated, but unable to find bill for order number ", orderNumber);
}
} catch (NoSuchAlgorithmException e) {
logger.warn("THIS SHOULD NEVER HAPPEN! (md5 hashfunction should always exist)", e);
} else {
logbean.logMessage(SecurityLogType.verkkomaksu, permbean.getCurrentUser(), "Unable to validate order number: ", orderNumber, " calculated checksum: ", calculatedHash, " authcode ", authcode, " paid ", paid, " method ", method);
}
return ret;
}
......@@ -206,7 +198,8 @@ public class VerkkomaksutFiBean implements VerkkomaksutFiBeanLocal {
postRequest.setHeader("Content-Type", "application/xml");
postRequest.setHeader("X-Verkkomaksut-Api-Version", "1");
postRequest.setEntity(new StringEntity(outputPayment(paymentMsg)));
// postRequest.setEntity(new
// StringEntity(outputPayment(paymentMsg)));
HttpResponse response = client.execute(postRequest);
......
<?xml version="1.0" encoding="utf-8"?>
<trade>
<id>3821058</id>
<description/>
<status>1</status>
<returnURL>http://localhost/LanBortalWeb/checkout/return.jsf</returnURL>
<returnMAC/>
<cancelURL>http://localhost/LanBortalWeb/checkout/cancel.jsf</cancelURL>
<cancelMAC>8B97471C27317150BEC42B6948334584</cancelMAC>
<rejectURL>http://localhost/LanBortalWeb/checkout/reject.jsf</rejectURL>
<delayedURL>http://localhost/LanBortalWeb/checkout/delayed.jsf</delayedURL>
<delayedMAC>00CF8456F8DF896B3FD6B4B42B45F8B3</delayedMAC>
<stamp>512</stamp>
<version>0001</version>
<reference>543761</reference>
<language>FI</language>
<content>1</content>
<deliveryDate>20120825</deliveryDate>
<firstname/>
<familyname/>
<address/>
<postcode/>
<postoffice/>
<country>FIN</country>
<device>10</device>
<algorithm>2</algorithm>
<paymentURL>https://payment.checkout.fi/p/3821058/DD086BF4-242DEF54-E0D72CE6-5D86580C</paymentURL>
<merchant>
<id>375917</id>
<company>Testi Oy</company>
<name>Testi Henkilö</name>
<email>testi@checkout.fi</email>
<address>Testikuja 1&#13;
12345 Testilä</address>
<vatId>123456-7</vatId>
<helpdeskNumber>012-345 678</helpdeskNumber>
</merchant>
<payments>
<payment>
<id>4358863</id>
<amount>6500</amount>
<stamp>512</stamp>
<banks>
<nordea url="https://solo3.nordea.fi/cgi-bin/SOLOPM01" icon="https://payment.checkout.fi/static/img/nordea.png" name="Nordea">
<SOLOPMT_VERSION>0003</SOLOPMT_VERSION>
<SOLOPMT_RCV_ID>12345678</SOLOPMT_RCV_ID>
<SOLOPMT_CUR>EUR</SOLOPMT_CUR>
<SOLOPMT_LANGUAGE>1</SOLOPMT_LANGUAGE>
<SOLOPMT_RCV_ACCOUNT/>
<SOLOPMT_REJECT>https://payment.checkout.fi/3xCDj1snWL/fi/reject</SOLOPMT_REJECT>
<SOLOPMT_CONFIRM>YES</SOLOPMT_CONFIRM>
<SOLOPMT_CANCEL>https://payment.checkout.fi/3xCDj1snWL/fi/back</SOLOPMT_CANCEL>
<SOLOPMT_RCV_NAME>Checkout Oy</SOLOPMT_RCV_NAME>
<SOLOPMT_DATE>EXPRESS</SOLOPMT_DATE>
<SOLOPMT_AMOUNT>65.00</SOLOPMT_AMOUNT>
<SOLOPMT_REF>43588631</SOLOPMT_REF>
<SOLOPMT_MSG>Testi Henkilö</SOLOPMT_MSG>
<SOLOPMT_MAC>9EE2A23AF88918BFCAA50DE88880280C</SOLOPMT_MAC>
<SOLOPMT_STAMP>3821058</SOLOPMT_STAMP>
<SOLOPMT_RETURN>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</SOLOPMT_RETURN>
<SOLOPMT_KEYVERS>0001</SOLOPMT_KEYVERS>
</nordea>
<osuuspankki url="https://kultaraha.op.fi/cgi-bin/krcgi" icon="https://payment.checkout.fi/static/img/osuuspankki.png" name="Osuuspankki">
<VALUUTTALAJI>EUR</VALUUTTALAJI>
<VIITE>43588631</VIITE>
<MAKSUTUNNUS>3821058</MAKSUTUNNUS>
<action_id>701</action_id>
<MYYJA>Esittelymyyja</MYYJA>
<SUMMA>65.00</SUMMA>
<VIESTI>Testi Henkilö</VIESTI>
<TARKISTE>B6951EC4B7CC3F31C693351E08868545</TARKISTE>
<PALUU-LINKKI>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</PALUU-LINKKI>
<VERSIO>1</VERSIO>
<TARKISTE-VERSIO>1</TARKISTE-VERSIO>
<VAHVISTUS>K</VAHVISTUS>
<PERUUTUS-LINKKI>https://payment.checkout.fi/3xCDj1snWL/fi/back</PERUUTUS-LINKKI>
</osuuspankki>
<samlink url="https://verkkomaksu.inetpankki.samlink.fi/vm/login.html" icon="https://payment.checkout.fi/static/img/sppopmaksu.gif" name="SP, Nooa, POP, Aktia">
<NET_VERSION>002</NET_VERSION>
<NET_SELLER_ID>0000000000</NET_SELLER_ID>
<NET_CUR>EUR</NET_CUR>
<NET_REJECT>https://payment.checkout.fi/3xCDj1snWL/fi/reject</NET_REJECT>
<NET_CONFIRM>YES</NET_CONFIRM>
<NET_CANCEL>https://payment.checkout.fi/3xCDj1snWL/fi/back</NET_CANCEL>
<NET_DATE>EXPRESS</NET_DATE>
<NET_AMOUNT>65,00</NET_AMOUNT>
<NET_REF>43588631</NET_REF>
<NET_MSG>Testi Henkilö</NET_MSG>
<NET_MAC>293305EFADD49443F9D3DF688237AF93</NET_MAC>
<NET_STAMP>3821058</NET_STAMP>
<NET_RETURN>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</NET_RETURN>
</samlink>
<sampo url="https://verkkopankki.sampopankki.fi/SP/vemaha/VemahaApp" icon="https://payment.checkout.fi/static/img/sammon_verkkomaksu.gif" name="Sampo Pankki">
<SUMMA>65.00</SUMMA>
<VIITE>43588631</VIITE>
<KNRO>000000000000</KNRO>
<VALUUTTA>EUR</VALUUTTA>
<VERSIO>3</VERSIO>
<OKURL>https://payment.checkout.fi/3xCDj1snWL/fi/confirm?ORDER=3821058&amp;ORDERMAC=2662642DF9C2981C19106D1C3302BFAD</OKURL>
<VIRHEURL>https://payment.checkout.fi/3xCDj1snWL/fi/back</VIRHEURL>
<TARKISTE>efc9f89cccfd53506b8f317bb8e1ae79</TARKISTE>
<lng>1</lng>
</sampo>
<handelsbanken url="https://verkkomaksu.inetpankki.samlink.fi/vm/SHBlogin.html" icon="https://payment.checkout.fi/static/img/handelsbanken.gif" name="Handelsbanken">
<NET_VERSION>002</NET_VERSION>
<NET_SELLER_ID>0000000000</NET_SELLER_ID>
<NET_CUR>EUR</NET_CUR>
<NET_REJECT>https://payment.checkout.fi/3xCDj1snWL/fi/reject</NET_REJECT>
<NET_CONFIRM>YES</NET_CONFIRM>
<NET_CANCEL>https://payment.checkout.fi/3xCDj1snWL/fi/back</NET_CANCEL>
<NET_DATE>EXPRESS</NET_DATE>
<NET_AMOUNT>65,00</NET_AMOUNT>
<NET_REF>43588631</NET_REF>
<NET_MSG>Testi Henkilö</NET_MSG>
<NET_MAC>293305EFADD49443F9D3DF688237AF93</NET_MAC>
<NET_STAMP>3821058</NET_STAMP>
<NET_RETURN>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</NET_RETURN>
</handelsbanken>
<spankki url="https://online.s-pankki.fi/service/paybutton" icon="https://payment.checkout.fi/static/img/S_Pankki_Green_78.gif" name="S-Pankki">
<AAB_VERSION>0002</AAB_VERSION>
<AAB_STAMP>3821058</AAB_STAMP>
<AAB_RCV_ID>SPANKKIESHOPID</AAB_RCV_ID>
<AAB_RCV_ACCOUNT>393900-01002369</AAB_RCV_ACCOUNT>
<AAB_RCV_NAME>CHECKOUT FINLAND OY</AAB_RCV_NAME>
<AAB_LANGUAGE>1</AAB_LANGUAGE>
<AAB_AMOUNT>65,00</AAB_AMOUNT>
<AAB_REF>43588631</AAB_REF>
<AAB_DATE>EXPRESS</AAB_DATE>
<AAB_MSG>Testi Henkilö</AAB_MSG>
<AAB_RETURN>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</AAB_RETURN>
<AAB_CANCEL>https://payment.checkout.fi/3xCDj1snWL/fi/back</AAB_CANCEL>
<AAB_REJECT>https://payment.checkout.fi/3xCDj1snWL/fi/reject</AAB_REJECT>
<AAB_MAC>1CC537271ACF6FBBCAAECF871696F1C4</AAB_MAC>
<AAB_CONFIRM>YES</AAB_CONFIRM>
<AAB_KEYVERS>0001</AAB_KEYVERS>
<AAB_CUR>EUR</AAB_CUR>
</spankki>
<alandsbanken url="https://online.alandsbanken.fi/aab/ebank/auth/initLogin.do?BV_UseBVCookie=no" icon="https://payment.checkout.fi/static/img/alandsbanken.gif" name="Ålandsbanken">
<AAB_VERSION>0002</AAB_VERSION>
<AAB_STAMP>3821058</AAB_STAMP>
<AAB_RCV_ID>AABESHOPID</AAB_RCV_ID>
<AAB_RCV_ACCOUNT>660100-1130855</AAB_RCV_ACCOUNT>
<AAB_RCV_NAME>Checkout</AAB_RCV_NAME>
<AAB_LANGUAGE>1</AAB_LANGUAGE>
<AAB_AMOUNT>65,00</AAB_AMOUNT>
<AAB_REF>43588631</AAB_REF>
<AAB_DATE>EXPRESS</AAB_DATE>
<AAB_MSG>Testi Henkilö</AAB_MSG>
<AAB_RETURN>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</AAB_RETURN>
<AAB_CANCEL>https://payment.checkout.fi/3xCDj1snWL/fi/back</AAB_CANCEL>
<AAB_REJECT>https://payment.checkout.fi/3xCDj1snWL/fi/reject</AAB_REJECT>
<AAB_MAC>61DE453D9346503E3298295A4E8717F0</AAB_MAC>
<AAB_CONFIRM>YES</AAB_CONFIRM>
<AAB_KEYVERS>0001</AAB_KEYVERS>
<AAB_CUR>EUR</AAB_CUR>
<BV_UseBVCookie>no</BV_UseBVCookie>
</alandsbanken>
<tapiola url="https://pankki.tapiola.fi/tap_bv/ebank/auth/initLogin.do" icon="https://payment.checkout.fi/static/img/tapiolan_verkkomaksu.gif" name="Tapiola Pankki">
<AAB_VERSION>0002</AAB_VERSION>
<AAB_STAMP>3821058</AAB_STAMP>
<AAB_RCV_ID>TAPESHOPID</AAB_RCV_ID>
<AAB_RCV_ACCOUNT>363630-01652643</AAB_RCV_ACCOUNT>
<AAB_RCV_NAME>Checkout</AAB_RCV_NAME>
<AAB_LANGUAGE>1</AAB_LANGUAGE>
<AAB_AMOUNT>65,00</AAB_AMOUNT>
<AAB_REF>43588631</AAB_REF>
<AAB_DATE>EXPRESS</AAB_DATE>
<AAB_MSG>Testi Henkilö</AAB_MSG>
<AAB_RETURN>https://payment.checkout.fi/3xCDj1snWL/fi/confirm</AAB_RETURN>
<AAB_CANCEL>https://payment.checkout.fi/3xCDj1snWL/fi/back</AAB_CANCEL>
<AAB_REJECT>https://payment.checkout.fi/3xCDj1snWL/fi/reject</AAB_REJECT>
<AAB_MAC>9EF87EB6D0DC0328519B7AA9B29DADC4</AAB_MAC>
<AAB_CONFIRM>YES</AAB_CONFIRM>
<AAB_KEYVERS>0001</AAB_KEYVERS>
<AAB_CUR>EUR</AAB_CUR>
<BV_UseBVCookie>NO</BV_UseBVCookie>
</tapiola>
<neopay url="https://www.neocard.fi/neopay11/" icon="https://payment.checkout.fi/static/img/logo_neo_maksuominaisuus.gif" name="Neocard">
<terminal_identifier>999</terminal_identifier>
<business_code>1234567-4</business_code>
<timestamp>20120825040836</timestamp>
<amount_to_debit>6500</amount_to_debit>
<order_info>Testi Henkilö</order_info>
<success_url>https://payment.checkout.fi/3xCDj1snWL/fi/confirm?p=4358863&amp;t=3821058&amp;amount=6500</success_url>
<failure_url>https://payment.checkout.fi/3xCDj1snWL/fi/back</failure_url>
<cancel_url>https://payment.checkout.fi/3xCDj1snWL/fi/reject</cancel_url>
<checksum>cef67d792662f5a95a766a6b259f181f</checksum>
</neopay>
<tilisiirto url="https://payment.checkout.fi/3xCDj1snWL/fi/tilisiirto" icon="https://payment.checkout.fi/static/img/tilisiirto.gif" name="Tilisiirto">
<bank>Nordea</bank>
<iban>FI06 1146 3001 1145 34</iban>
<bic>NDEAFIHH</bic>
<reference>43588631</reference>
<amount>6500</amount>
<receiver>Checkout Finland Oy</receiver>
</tilisiirto>
<ape url="https://payment.checkout.fi/3xCDj1snWL/fi/wallet" icon="https://payment.checkout.fi/static/img/ape_logo_64x64.png" name="APE Kukkaro">
<merchant>checkout</merchant>
<item>43588631</item>
<price>65.00</price>
<mac>2043fd7d763519a0badd05dad4b0a639</mac>
</ape>
</banks>
</payment>
</payments>
</trade>
\ No newline at end of file
package fi.insomnia.bortal.checkoutfi;
public enum CheckoutFiParam {
// DO NOT CHANGE THE ORDER OF THESE!
// The md5 checksum is calculated from
// these values...
VERSION("0001"),
STAMP(null),
AMOUNT(null),
REFERENCE(null),
MESSAGE(null),
LANGUAGE("FI"),
MERCHANT(null),
RETURN(null),
CANCEL(null),
REJECT(null),
DELAYED(null),
COUNTRY("FIN"),
CURRENCY("EUR"),
DEVICE("10"),
CONTENT("1"),
TYPE("0"),
ALGORITHM("2"),
DELIVERY_DATE(null),
FIRSTNAME(null),
FAMILYNAME(null),
ADDRESS(null),
POSTCODE(null),
POSTOFFICE(null), ;
private final String defaultValue;
private CheckoutFiParam(String def) {
defaultValue = def;
}
public String getDefaultValue() {
return defaultValue;
}
}
package fi.insomnia.bortal.facade;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
......@@ -14,6 +16,7 @@ import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.AccountEvent_;
import fi.insomnia.bortal.model.EventUser;
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.Role_;
......@@ -59,4 +62,33 @@ public class AccountEventFacade extends IntegerPkGenericFacade<AccountEvent> {
);
return getEm().createQuery(cq).getResultList();
}
public BigDecimal getProductCount(List<Product> list) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<BigDecimal> cq = cb.createQuery(BigDecimal.class);
Root<AccountEvent> root = cq.from(AccountEvent.class);
List<Integer> ids = new ArrayList<Integer>();
for (Product l : list) {
ids.add(l.getId());
}
cq.where(root.get(AccountEvent_.product).get(Product_.id).in(ids));
cq.select(cb.sum(root.get(AccountEvent_.quantity)));
return super.getSingleNullableResult(getEm().createQuery(cq));
}
public BigDecimal getProductCount(List<Product> list, EventUser eventuser) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<BigDecimal> cq = cb.createQuery(BigDecimal.class);
Root<AccountEvent> root = cq.from(AccountEvent.class);
List<Integer> ids = new ArrayList<Integer>();
for (Product l : list) {
ids.add(l.getId());
}
cq.where(root.get(AccountEvent_.product).get(Product_.id).in(ids),
cb.equal(root.get(AccountEvent_.user), eventuser));
cq.select(cb.sum(root.get(AccountEvent_.quantity)));
return super.getSingleNullableResult(getEm().createQuery(cq));
}
}
......@@ -64,4 +64,5 @@ public class BillFacade extends IntegerPkGenericFacade<Bill> {
return getEm().createQuery(cq).getResultList();
}
}
......@@ -18,7 +18,9 @@ import fi.insomnia.bortal.bortal.views.BillSummary;
import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.BillLine_;
import fi.insomnia.bortal.model.Bill_;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product;
@Stateless
@LocalBean
......@@ -53,4 +55,39 @@ public class BillLineFacade extends IntegerPkGenericFacade<BillLine> {
}
return retmap.values();
}
public BillSummary getLineSummary(Product list, LanEvent event) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<BillLine> cq = cb.createQuery(BillLine.class);
Root<BillLine> root = cq.from(BillLine.class);
cq.where(cb.equal(root.get(BillLine_.bill).get(Bill_.event), event),
cb.equal(root.get(BillLine_.lineProduct), list));
List<BillLine> lines = getEm().createQuery(cq).getResultList();
BillSummary ret = new BillSummary(list.getName());
for (BillLine bl : lines) {
ret.addLine(bl);
}
return ret;
}
public BillSummary getLineSummary(Product list, LanEvent event, EventUser user) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<BillLine> cq = cb.createQuery(BillLine.class);
Root<BillLine> root = cq.from(BillLine.class);
cq.where(cb.equal(root.get(BillLine_.bill).get(Bill_.event), event),
cb.equal(root.get(BillLine_.lineProduct), list),
cb.equal(root.get(BillLine_.bill).get(Bill_.user), user)
);
List<BillLine> lines = getEm().createQuery(cq).getResultList();
BillSummary ret = new BillSummary(list.getName());
for (BillLine bl : lines) {
ret.addLine(bl);
}
return ret;
}
}
......@@ -12,6 +12,8 @@ import javax.persistence.criteria.Root;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.PrintedCard_;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.User_;
......@@ -63,4 +65,53 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
return getEm().createQuery(cq).getResultList();
}
public EventUser findByBarcode(String barcode) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
Root<PrintedCard> root = cq.from(PrintedCard.class);
cq.select(root.get(PrintedCard_.user));
cq.where(
cb.equal(root.get(PrintedCard_.barcode), barcode),
cb.equal(root.get(PrintedCard_.event), eventBean.getCurrentEvent())
);
return getSingleNullableResult(getEm().createQuery(cq));
}
// public SearchResult<EventUser> searchUser(int page, int pagesize, String
// sort, String search) {
//
// List<FacadeCallback<EventUser>> callbacks = new
// ArrayList<FacadeCallback<EventUser>>();
// if (sort == null || sort.isEmpty()) {
// callbacks.add(new OrderCallback<EventUser>(false, EventUser_.id));
// } else {
// callbacks.add(new OrderCallback<EventUser>(false, sort));
// }
//
// if (search == null || search.isEmpty()) {
// callbacks.add(new EventUserEventlimiter(eventBean.getCurrentEvent()));
// }
// callbacks.add(new EventUserSearchCreator(search,
// UserFacade.getAttrlist()));
// return super.searcher(page, pagesize, callbacks);
//
// // return this.search(page, pagesize, query, NAMEFIELDS, sort);
// }
//
// public class EventUserEventlimiter implements FacadeCallback<EventUser> {
//
// private LanEvent ev;
//
// public EventUserEventlimiter(LanEvent currentEvent) {
// ev = currentEvent;
// }
//
// @Override
// public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser>
// root, List<Predicate> predicates) {
// predicates.add(cb.equal(root.get(EventUser), ev));
// }
// }
}
......@@ -9,21 +9,20 @@ import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public abstract class GenericFacade<C extends ModelInterface> {
private final Class<C> entClass;
private static final Logger logger = LoggerFactory.getLogger(GenericFacade.class);
// private static final Logger logger =
// LoggerFactory.getLogger(GenericFacade.class);
public GenericFacade(Class<C> entityClass) {
this.entClass = entityClass;
......@@ -110,53 +109,55 @@ public abstract class GenericFacade<C extends ModelInterface> {
return ret;
}
@Deprecated
protected List<C> search(String query, String[] fields, String orderfield) {
return search(0, 0, query, fields, orderfield);
}
@Deprecated
protected SearchResult<C> searcher(int page, int pagesize, String query, String[] fields, String orderfield) {
SearchResult<C> ret = new SearchResult<C>();
ret.setResults(search(page, pagesize, query, fields, orderfield));
ret.setResultcount(searchCount(query, fields));
return ret;
}
// @Deprecated
// protected List<C> search(String query, String[] fields, String
// orderfield) {
// return search(0, 0, query, fields, orderfield);
// }
//
// @Deprecated
// protected SearchResult<C> searcher(int page, int pagesize, String query,
// String[] fields, String orderfield) {
// SearchResult<C> ret = new SearchResult<C>();
// ret.setResults(search(page, pagesize, query, fields, orderfield));
// ret.setResultcount(searchCount(query, fields));
// return ret;
// }
// Le fu... Tuota.. generics ei hanskaa ... operaattoria.. tehdään siis
// näin... :(
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> callback) {
return searcher(page, pagesize, Collections.singletonList(callback));
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) {
return searcher(search, Collections.singletonList(callback));
}
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> cb1, FacadeCallback<C> cb2) {
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> cb1, FacadeCallback<C> cb2) {
ArrayList<FacadeCallback<C>> cbs = new ArrayList<FacadeCallback<C>>();
cbs.add(cb1);
cbs.add(cb2);
return searcher(page, pagesize, cbs);
return searcher(search, cbs);
}
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3) {
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3) {
ArrayList<FacadeCallback<C>> cbs = new ArrayList<FacadeCallback<C>>();
cbs.add(cb1);
cbs.add(cb2);
cbs.add(cb3);
return searcher(page, pagesize, cbs);
return searcher(search, cbs);
}
protected SearchResult<C> searcher(int page, int pagesize, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3, FacadeCallback<C> cb4) {
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> cb1, FacadeCallback<C> cb2, FacadeCallback<C> cb3, FacadeCallback<C> cb4) {
ArrayList<FacadeCallback<C>> cbs = new ArrayList<FacadeCallback<C>>();
cbs.add(cb1);
cbs.add(cb2);
cbs.add(cb3);
cbs.add(cb4);
return searcher(page, pagesize, cbs);
return searcher(search, cbs);
}
protected SearchResult<C> searcher(int page, int pagesize, List<FacadeCallback<C>> list) {
protected SearchResult<C> searcher(SearchQuery search, List<FacadeCallback<C>> list) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<C> listCQuery = cb.createQuery(getEntityClass());
......@@ -169,22 +170,28 @@ public abstract class GenericFacade<C extends ModelInterface> {
TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
TypedQuery<C> listQ = getEm().createQuery(listCQuery);
if (pagesize > 0) {
listQ.setFirstResult(page * pagesize);
listQ.setMaxResults(pagesize);
if (search.getPagesize() > 0) {
listQ.setFirstResult(search.getPage() * search.getPagesize());
listQ.setMaxResults(search.getPagesize());
}
return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult());
}
private Root<C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) {
protected Root<C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) {
return searchCallbacks(cq, list, getEntityClass());
}
protected <T extends ModelInterface> Root<T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
Root<C> root = cq.from(getEntityClass());
Root<T> root = cq.from(clazz);
ArrayList<Predicate> predicates = new ArrayList<Predicate>();
for (FacadeCallback<C> fc : list) {
fc.exec(cb, cq, root, predicates);
for (FacadeCallback<T> fc : list) {
if (fc != null) {
fc.exec(cb, cq, root, predicates);
}
}
if (!predicates.isEmpty()) {
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
......@@ -195,52 +202,55 @@ public abstract class GenericFacade<C extends ModelInterface> {
}
@Deprecated
protected List<C> search(int page, int pagesize, String query, String[] fields, String orderfield) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<C> cq = cb.createQuery(getEntityClass());
Root<C> root = cq.from(getEntityClass());
addPredicates(cq, root, query, fields);
TypedQuery<C> q = getEm().createQuery(cq);
if (pagesize > 0) {
q.setFirstResult(page * pagesize);
q.setMaxResults(pagesize);
}
List<C> ret = q.getResultList();
return ret;
}
@Deprecated
protected void addPredicates(CriteriaQuery<?> cq, Root<C> root, String query, String[] fields) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
if (query != null && !query.isEmpty() && fields != null && fields.length > 0) {
List<Predicate> preds = new ArrayList<Predicate>();
for (String field : fields) {
Path<String> rootfield = root.get(field);
preds.add(cb.like(cb.lower(rootfield), query));
}
cq.where(cb.or(preds.toArray(new Predicate[preds.size()])));
}
}
@Deprecated
protected long searchCount(String query, String[] fields) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<C> root = cq.from(getEntityClass());
addPredicates(cq, root, query, fields);
cq.select(getEm().getCriteriaBuilder().count(root));
TypedQuery<Long> q = getEm().createQuery(cq);
return q.getSingleResult();
}
// @Deprecated
// protected List<C> search(int page, int pagesize, String query, String[]
// fields, String orderfield) {
//
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<C> cq = cb.createQuery(getEntityClass());
//
// Root<C> root = cq.from(getEntityClass());
//
// addPredicates(cq, root, query, fields);
//
// TypedQuery<C> q = getEm().createQuery(cq);
// if (pagesize > 0) {
// q.setFirstResult(page * pagesize);
// q.setMaxResults(pagesize);
//
// }
// List<C> ret = q.getResultList();
// return ret;
// }
//
// @Deprecated
// protected void addPredicates(CriteriaQuery<?> cq, Root<C> root, String
// query, String[] fields) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// if (query != null && !query.isEmpty() && fields != null && fields.length
// > 0) {
// List<Predicate> preds = new ArrayList<Predicate>();
// for (String field : fields) {
// Path<String> rootfield = root.get(field);
// preds.add(cb.like(cb.lower(rootfield), query));
// }
// cq.where(cb.or(preds.toArray(new Predicate[preds.size()])));
// }
//
// }
//
// @Deprecated
// protected long searchCount(String query, String[] fields) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<Long> cq = cb.createQuery(Long.class);
// Root<C> root = cq.from(getEntityClass());
//
// addPredicates(cq, root, query, fields);
// cq.select(getEm().getCriteriaBuilder().count(root));
//
// TypedQuery<Long> q = getEm().createQuery(cq);
// return q.getSingleResult();
// }
// @Deprecated
// public List<C> findAll(int page, int pagesize, String sort) {
......
......@@ -65,5 +65,18 @@ public class ProductFacade extends IntegerPkGenericFacade<Product> {
return getEm().createQuery(cq).getResultList();
}
public Product findProductByBarcode(String barcode) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Product> cq = cb.createQuery(Product.class);
Root<Product> root = cq.from(Product.class);
cq.where(
cb.equal(root.get(Product_.barcode), barcode)
);
return super.getSingleNullableResult(getEm().createQuery(cq));
}
}
......@@ -54,13 +54,13 @@ public class SitePageFacade extends IntegerPkGenericFacade<SitePage> {
Path<SitePage> parentpath = root.get(SitePage_.parent);
Predicate rootpred = null;
if (parentpath == null)
if (siteroot == null)
{
rootpred = cb.isNull(parentpath);
}
else
{
rootpred = cb.equal(parentpath, parentpath);
rootpred = cb.equal(parentpath, siteroot);
}
cq.where(
......
......@@ -4,20 +4,30 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.facade.callbacks.OrderCallback;
import fi.insomnia.bortal.facade.callbacks.StringSearchPredicateCreator;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.User_;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
@Stateless
......@@ -28,7 +38,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
private static List<SingularAttribute<User, String>> SEARCHATTRS;
private List<SingularAttribute<User, String>> getAttrlist() {
static List<SingularAttribute<User, String>> getAttrlist() {
if (SEARCHATTRS == null)
{
ArrayList<SingularAttribute<User, String>> buildAttrs = new ArrayList<SingularAttribute<User, String>>();
......@@ -46,6 +56,9 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
return SEARCHATTRS;
}
@EJB
private EventBeanLocal eventBean;
// final String[] NAMEFIELDS = { "nick", "login", "firstnames", "lastname",
// "email" };
......@@ -67,7 +80,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
cq.where(cb.equal(root.get(User_.login), login));
cq.where(cb.equal(root.get(User_.login), login.toLowerCase().trim()));
return getSingleNullableResult(getEm().createQuery(cq));
}
......@@ -92,23 +105,17 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
return super.merge(user);
}
public SearchResult<User> searchUser(int page, int pagesize, String sort, String search) {
OrderCallback<User> orderCall = null;
if (sort == null || sort.isEmpty()) {
orderCall = new OrderCallback<User>(false, User_.id);
}
else
{
orderCall = new OrderCallback<User>(false, sort);
public SearchResult<User> searchAllUsers(SearchQuery search) {
List<FacadeCallback<User>> callbacks = new ArrayList<FacadeCallback<User>>();
if (search.getSort() == null || search.getSort().isEmpty()) {
callbacks.add(new OrderCallback<User>(false, User_.id));
} else {
callbacks.add(new OrderCallback<User>(false, search.getSort()));
}
callbacks.add(new StringSearchPredicateCreator<User>(search.getSearch(), getAttrlist()));
return super.searcher(page, pagesize,
new StringSearchPredicateCreator<User>(search, getAttrlist()),
orderCall
);
return super.searcher(search, callbacks);
// return this.search(page, pagesize, query, NAMEFIELDS, sort);
}
......@@ -139,7 +146,47 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
return getEm().createQuery(cq).getResultList();
}
public SearchResult<User> searchEventUsers(SearchQuery query)
{
ArrayList<FacadeCallback<EventUser>> callbacks = new ArrayList<FacadeCallback<EventUser>>();
callbacks.add(new OrderCallback<EventUser>(false, EventUser_.id));
callbacks.add(new Eventlimiter(eventBean.getCurrentEvent()));
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> listCQuery = cb.createQuery(User.class);
CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);
Root<EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
Root<EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);
listCQuery.select(listRoot.join(EventUser_.user));
countCQuery.select(cb.count(countRoot.get(EventUser_.user)));
TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
TypedQuery<User> listQ = getEm().createQuery(listCQuery);
if (query.getPagesize() > 0) {
listQ.setFirstResult(query.getPage() * query.getPagesize());
listQ.setMaxResults(query.getPagesize());
}
return new SearchResult<User>(listQ.getResultList(), countQ.getSingleResult());
}
public class Eventlimiter implements FacadeCallback<EventUser> {
private LanEvent ev;
public Eventlimiter(LanEvent currentEvent) {
ev = currentEvent;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) {
predicates.add(cb.equal(root.get(EventUser_.event), ev));
}
}
}
......@@ -5,8 +5,8 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
......@@ -26,7 +26,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) {
if (searchval == null || attributes == null || attributes.isEmpty()) {
return;
}
......
package fi.insomnia.bortal.facade.callbacks;
import java.util.List;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.User;
public class EventUserSearchCreator extends PathStringSearchPredicateCreator<EventUser, User> {
public EventUserSearchCreator(String search, List<SingularAttribute<User, String>> attrs) {
super(search, attrs);
}
public EventUserSearchCreator(String search, SingularAttribute<User, String> from) {
super(search, from);
}
@Override
protected Path<User> getPath(Path<EventUser> root) {
return root.get(EventUser_.user);
}
}
......@@ -4,12 +4,15 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public interface FacadeCallback<C extends ModelInterface> {
void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root, List<Predicate> predicates);
// void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root,
// List<Predicate> predicates);
void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<C> root, List<Predicate> predicates);
}
......@@ -4,8 +4,8 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger;
......@@ -24,7 +24,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
......
......@@ -6,7 +6,6 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
......@@ -30,7 +29,7 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) {
Class<?> rettype = cq.getResultType();
// Check if returntype is entity or are we for example counting results
......
package fi.insomnia.bortal.facade.callbacks;
import java.util.Collections;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public abstract class PathStringSearchPredicateCreator<T extends ModelInterface, D extends ModelInterface> implements FacadeCallback<T> {
private static final String WILDCARD = "%";
private String searchstr = null;
private List<SingularAttribute<D, String>> attributes = null;
public PathStringSearchPredicateCreator(String search, List<SingularAttribute<D, String>> attrs) {
if (addSearch(search)) {
attributes = attrs;
}
}
public PathStringSearchPredicateCreator(String search, SingularAttribute<D, String> from) {
if (addSearch(search)) {
attributes = Collections.singletonList(from);
}
}
private boolean addSearch(String search) {
if (search != null) {
search = search.trim().toLowerCase();
if (!search.isEmpty()) {
searchstr = new StringBuilder().append(WILDCARD).append(search).append(WILDCARD).toString();
return true;
}
}
searchstr = null;
return false;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> path, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
Path<D> entityPath = getPath(path);
for (String splitSearch : searchstr.split(" "))
{
splitSearch = splitSearch.trim();
if (splitSearch.isEmpty())
continue;
splitSearch = new StringBuilder().append(WILDCARD).append(splitSearch).append(WILDCARD).toString();
Predicate[] preds = new Predicate[attributes.size()];
int i = 0;
for (SingularAttribute<D, String> attr : attributes) {
preds[i++] = cb.like(cb.lower(entityPath.get(attr)), splitSearch);
}
predicates.add(cb.or(preds));
}
}
protected abstract Path<D> getPath(Path<T> root);
}
package fi.insomnia.bortal.facade.callbacks;
import java.util.Collections;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
public class StringSearchPredicateCreator<T extends ModelInterface> implements FacadeCallback<T> {
private static final String WILDCARD = "%";
private String searchstr = null;
private List<SingularAttribute<T, String>> attributes = null;
public class StringSearchPredicateCreator<T extends ModelInterface> extends PathStringSearchPredicateCreator<T, T> {
public StringSearchPredicateCreator(String search, List<SingularAttribute<T, String>> attrs) {
if (addSearch(search)) {
attributes = attrs;
}
super(search, attrs);
}
public StringSearchPredicateCreator(String search, SingularAttribute<T, String> from) {
if (addSearch(search)) {
attributes = Collections.singletonList(from);
}
}
private boolean addSearch(String search) {
if (search != null) {
search = search.trim().toLowerCase();
if (!search.isEmpty()) {
searchstr = new StringBuilder().append(WILDCARD).append(search).append(WILDCARD).toString();
return true;
}
}
searchstr = null;
return false;
super(search, from);
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
for (String splitSearch : searchstr.split(" "))
{
splitSearch = new StringBuilder().append(WILDCARD).append(splitSearch.trim()).append(WILDCARD).toString();
Predicate[] preds = new Predicate[attributes.size()];
int i = 0;
for (SingularAttribute<T, String> attr : attributes) {
preds[i++] = cb.like(cb.lower(root.get(attr)), splitSearch);
}
predicates.add(cb.or(preds));
}
protected Path<T> getPath(Path<T> root) {
return root;
}
}
......@@ -10,10 +10,6 @@
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
......@@ -16,6 +16,11 @@
</arguments>
</buildCommand>
<buildCommand>
<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
......@@ -26,5 +31,6 @@
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
</natures>
</projectDescription>
package fi.insomnia.bortal.beans;
import java.util.List;
import javax.ejb.Local;
import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.util.CheckoutBank;
import fi.insomnia.bortal.util.CheckoutReturnType;
@Local
public interface CheckoutFiBeanLocal {
boolean isPaymentEnabled();
List<CheckoutBank> getToken(Bill bill);
// List<CheckoutBank> testXml();
boolean validateReturn(CheckoutReturnType returnType, String version, String stamp, String reference, String payment, String status, String algorithm, String mac);
}
......@@ -3,14 +3,15 @@ package fi.insomnia.bortal.beans;
import javax.ejb.Local;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LogEntry;
import fi.insomnia.bortal.model.User;
@Local
public interface LoggingBeanLocal {
LogEntry logMessage(SecurityLogType paramType, User user, String... description);
LogEntry logMessage(SecurityLogType paramType, LanEvent event, User user, Object... description);
LogEntry logMessage(SecurityLogType paramType, EventUser user, String... description);
LogEntry logMessage(SecurityLogType paramType, EventUser user, Object... description);
}
......@@ -5,7 +5,7 @@ import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.User;
@Local
public interface PermissionBeanLocal {
......@@ -16,8 +16,6 @@ public interface PermissionBeanLocal {
boolean isLoggedIn();
boolean isCurrentUser(IUser thisuser);
// boolean fatalPermission(IAppPermission perm, Object... failmessage);
// throws PermissionDeniedException;
......@@ -37,6 +35,10 @@ public interface PermissionBeanLocal {
EventUser getAnonEventUser();
boolean isCurrentUser(User user);
boolean isCurrentUser(EventUser user);
// boolean hasPermission(String perm);
}
......@@ -2,7 +2,9 @@ package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;
......@@ -11,14 +13,13 @@ import fi.insomnia.bortal.model.Discount;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.ProductFlag;
import fi.insomnia.bortal.model.Role;
@Local
public interface ProductBeanLocal {
List<Product> listUserShoppableProducts();
List<Product> findProductsByFlag(ProductFlag ... productFlags);
List<Product> findProductsByFlag(ProductFlag... productFlags);
void create(Product prod);
......@@ -36,6 +37,8 @@ public interface ProductBeanLocal {
Product findById(int parseInt);
Product findByBarcode(String barcode);
List<Product> findForStaffshop();
Discount findDiscount(Integer discountid);
......@@ -43,5 +46,9 @@ public interface ProductBeanLocal {
Discount save(Discount discount);
BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date);
HashMap<Integer, BigDecimal> getProductLimit(Map<Integer, BigDecimal> prodCounts, EventUser user);
BigDecimal getProductLimit(Product product, EventUser user, Map<Integer, BigDecimal> prodCounts);
}
......@@ -28,4 +28,6 @@ public interface SitePageBeanLocal {
List<PageContent> findContentsForUser(String name);
SitePage findSitename(String managedPage);
}
......@@ -10,6 +10,7 @@ import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
@Local
......@@ -17,7 +18,9 @@ public interface UserBeanLocal {
List<EventUser> getUsers();
SearchResult<User> getUsers(int page, int pagesize, String sort, String search);
SearchResult<User> getUsers(SearchQuery search);
SearchResult<User> getEventUsers(SearchQuery search);
EventUser mergeChanges(EventUser user);
......@@ -66,4 +69,6 @@ public interface UserBeanLocal {
EventUser validateUser(String username, String password);
EventUser getUserByBarcode(String barcode);
}
......@@ -3,6 +3,9 @@ package fi.insomnia.bortal.clientutils;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.apps.IAppPermission;
public class BortalLocalContextHolder {
......@@ -10,13 +13,23 @@ public class BortalLocalContextHolder {
private static final ThreadLocal<BortalLocalContextHolder> THREAD_WITH_CONTEXT = new ThreadLocal<BortalLocalContextHolder>();
private String hostname;
private boolean ssl = false;
private Integer hostnameId;
private final Map<IAppPermission, Boolean> rightcache = new HashMap<IAppPermission, Boolean>();
private static boolean inDevelopmentMode = false;
public BortalLocalContextHolder() {
private static final Logger logger = LoggerFactory.getLogger(BortalLocalContextHolder.class);
private BortalLocalContextHolder() {
super();
}
private BortalLocalContextHolder(BortalLocalContextHolder old) {
super();
this.hostname = old.hostname;
this.ssl = old.ssl;
}
public static void setHostname(String hostname) {
......@@ -84,4 +97,18 @@ public class BortalLocalContextHolder {
getThread().hostnameId = id;
}
public static boolean isSsl() {
return getThread().ssl;
}
public static void setSsl(boolean ssl) {
getThread().ssl = ssl;
}
public static void copy(BortalLocalContextHolder contextHolder) {
if (THREAD_WITH_CONTEXT.get() != null) {
logger.warn("Context for thread is not empty. Received hostname {}", THREAD_WITH_CONTEXT.get().hostname);
}
THREAD_WITH_CONTEXT.set(new BortalLocalContextHolder(contextHolder));
}
}
\ No newline at end of file
package fi.insomnia.bortal.util;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class CheckoutBank {
private final String key;
private final String url;
private final String icon;
private final String name;
private final List<Valuepair> postParams = new ArrayList<Valuepair>();
private static final Logger logger = LoggerFactory.getLogger(CheckoutBank.class);
public CheckoutBank(Node bank) {
if (bank.getNodeType() != 1)
{
throw new RuntimeException("Wrong type of node " + bank + " type " + bank.getNodeType());
}
key = bank.getNodeName();
logger.info("Bank type {}", bank);
NamedNodeMap attrs = bank.getAttributes();
String iconval = null;
String nameval = null;
String urlval = null;
for (int j = 0; j < attrs.getLength(); ++j)
{
Node attr = attrs.item(j);
if (attr.getNodeName().equals("icon")) {
iconval = attr.getNodeValue();
} else if (attr.getNodeName().equals("name")) {
nameval = attr.getNodeValue();
} else if (attr.getNodeName().equals("url")) {
urlval = attr.getNodeValue();
}
}
icon = iconval;
name = nameval;
url = urlval;
NodeList children = bank.getChildNodes();
for (int i = 0; i < children.getLength(); ++i)
{
Node childnode = children.item(i);
if (childnode.getNodeType() == 1)
{
String paramName = childnode.getNodeName();
String paramValue = childnode.getTextContent();
getPostParams().add(new Valuepair(paramName, paramValue));
logger.info("Added param for {} name {} value {}", new Object[] { key, paramName, paramValue });
}
}
System.out.println();
}
public String getKey() {
return key;
}
public String getUrl() {
return url;
}
public String getIcon() {
return icon;
}
public String getName() {
return name;
}
public List<Valuepair> getPostParams() {
return postParams;
}
}
package fi.insomnia.bortal.util;
public enum CheckoutReturnType {
RETURN, DELAYED, REJECT, CANCEL
}
......@@ -5,7 +5,7 @@ import java.io.UnsupportedEncodingException;
import javax.mail.internet.InternetAddress;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.User;
public class MailMessage implements Serializable {
/**
......@@ -99,7 +99,7 @@ public class MailMessage implements Serializable {
return charset;
}
public void setTo(IUser user) {
public void setTo(User user) {
setToName(user.getWholeName());
setToAddress(user.getEmail());
......
package fi.insomnia.bortal.util;
public class Valuepair {
private String key;
private String value;
public String toString()
{
return new StringBuilder("Valuepair ").append(key).append(" ").append(value).toString();
}
public Valuepair(String paramName, String paramValue) {
key = paramName;
value = paramValue;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
......@@ -8,10 +8,6 @@
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
......@@ -17,7 +17,7 @@
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
<arguments>
</arguments>
</buildCommand>
......@@ -36,6 +36,11 @@
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
......@@ -43,5 +48,6 @@
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.axdt.as3.imp.nature</nature>
<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
</natures>
</projectDescription>
#Thu Oct 27 18:05:25 EEST 2011
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
......
......@@ -4,7 +4,7 @@
<fixed facet="jst.utility"/>
<fixed facet="jst.java"/>
<fixed facet="jpt.jpa"/>
<installed facet="jst.java" version="6.0"/>
<installed facet="jst.utility" version="1.0"/>
<installed facet="jpt.jpa" version="2.0"/>
<installed facet="jst.java" version="1.6"/>
</faceted-project>
Manifest-Version: 1.0
Class-Path: lib/LanBortalUtilities.jar
bcprov-jdk16-146.jar
bcmail-jdk16-146.jar
Class-Path: bcprov-jdk16-146.jar
bcmail-jdk16-146.jar
LanBortalUtilities.jar
......@@ -193,9 +193,9 @@ public class Bill extends GenericEntity {
public Bill(LanEvent event, EventUser user) {
this(event);
this.setUser(user);
this.setAddr1(user.getFirstnames() + " " + user.getLastname());
this.setAddr2(user.getAddress());
this.setAddr3(user.getZip() + " " + user.getTown());
this.setAddr1(user.getUser().getFirstnames() + " " + user.getUser().getLastname());
this.setAddr2(user.getUser().getAddress());
this.setAddr3(user.getUser().getZip() + " " + user.getUser().getTown());
}
public Bill(LanEvent event) {
......
......@@ -26,7 +26,9 @@ public abstract class EntityEquals {
@Override
public boolean equals(Object o) {
boolean ret = false;
if (o != null && o instanceof EntityEquals && this.getClass().getCanonicalName().equals(o.getClass().getCanonicalName())) {
if (this == o) {
ret = true;
} else if (o != null && o instanceof EntityEquals && this.getClass().getCanonicalName().equals(o.getClass().getCanonicalName())) {
EntityEquals oobj = (EntityEquals) o;
if (getId() == null) {
ret = (getRndid().equals(oobj.rndid));
......
......@@ -9,9 +9,11 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
......@@ -20,6 +22,8 @@ import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.eclipse.persistence.annotations.OptimisticLocking;
......@@ -30,7 +34,7 @@ import fi.insomnia.bortal.enums.Gender;
@Entity
@Table(name = "event_users", uniqueConstraints = @UniqueConstraint(columnNames = { EventUser.USER_ID_COLUMN, EventUser.EVENT_ID_COLUMN }))
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class EventUser extends GenericEntity implements IUser {
public class EventUser extends GenericEntity {
protected static final String USER_ID_COLUMN = "user_id";
protected static final String EVENT_ID_COLUMN = "event_id";
......@@ -38,6 +42,7 @@ public class EventUser extends GenericEntity implements IUser {
@ManyToOne(cascade = { PERSIST, MERGE, REFRESH, DETACH })
@JoinColumn(nullable = false, name = USER_ID_COLUMN)
private User user;
@ManyToOne
@JoinColumn(nullable = false, name = EVENT_ID_COLUMN)
private LanEvent event;
......@@ -92,13 +97,39 @@ public class EventUser extends GenericEntity implements IUser {
@OneToMany(mappedBy = "user")
private List<PollAnswer> pollAnswers;
@ManyToOne()
@JoinColumn(name = "creator")
private EventUser creator;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "createtime", nullable = false, updatable = false)
private Date eventuserCreated;
public EventUser getCreator() {
return creator;
}
public void setCreator(EventUser creator) {
this.creator = creator;
}
public Date getEventuserCreated() {
return eventuserCreated;
}
public void setEventuserCreated(Date eventuserCreated) {
this.eventuserCreated = eventuserCreated;
}
public EventUser()
{
super();
}
public EventUser(User usr, LanEvent evnt) {
public EventUser(User usr, LanEvent evnt, EventUser usercreator) {
super();
this.eventuserCreated = new Date();
this.creator = usercreator;
this.user = usr;
this.event = evnt;
}
......@@ -223,222 +254,178 @@ public class EventUser extends GenericEntity implements IUser {
this.pollAnswers = pollAnswers;
}
@Override
public void setCreated(Calendar created) {
user.setCreated(created);
}
@Override
public boolean getActive() {
return user.getActive();
}
@Override
public void setActive(boolean active) {
user.setActive(active);
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public void setPassword(String password) {
user.setPassword(password);
}
@Override
public String getWholeName() {
return user.getWholeName();
}
@Override
public String getLastname() {
return user.getLastname();
}
@Override
public void setLastname(String lastname) {
user.setLastname(lastname);
}
@Override
public String getFirstnames() {
return user.getFirstnames();
}
@Override
public void setFirstnames(String firstnames) {
user.setFirstnames(firstnames);
}
@Override
public Calendar getBirthday() {
public Date getBirthday() {
return user.getBirthday();
}
@Override
public void setBirthday(Calendar birthday) {
public void setBirthday(Date birthday) {
user.setBirthday(birthday);
}
@Override
public String getNick() {
return user.getNick();
}
@Override
public void setNick(String nick) {
user.setNick(nick);
}
@Override
public String getEmail() {
return user.getEmail();
}
@Override
public void setEmail(String email) {
user.setEmail(email);
}
@Override
public String getAddress() {
return user.getAddress();
}
@Override
public void setAddress(String address) {
user.setAddress(address);
}
@Override
public String getZip() {
return user.getZip();
}
@Override
public void setZip(String zip) {
user.setZip(zip);
}
@Override
public String getTown() {
return user.getTown();
}
@Override
public void setTown(String town) {
user.setTown(town);
}
@Override
public String getPhone() {
return user.getPhone();
}
@Override
public void setPhone(String phone) {
user.setPhone(phone);
}
@Override
public String getLogin() {
return user.getLogin();
}
@Override
public void setLogin(String login) {
user.setLogin(login);
}
@Override
public List<UserImage> getUserImageList() {
return user.getUserImageList();
}
@Override
public void setUserImageList(List<UserImage> userImageList) {
user.setUserImageList(userImageList);
}
@Override
public String getConfirmHash() {
return user.getConfirmHash();
}
@Override
public void setConfirmHash(String confirmHash) {
user.setConfirmHash(confirmHash);
}
@Override
public Calendar getConfirmTime() {
return user.getConfirmTime();
}
@Override
public void setConfirmTime(Calendar confirmTime) {
user.setConfirmTime(confirmTime);
}
@Override
public void resetPassword(String password) {
user.resetPassword(password);
}
@Override
public boolean checkPassword(String plainPassword) {
return user.checkPassword(plainPassword);
}
@Override
public void setSuperadmin(boolean superadmin) {
user.setSuperadmin(superadmin);
}
@Override
public boolean isSuperadmin() {
return user.isSuperadmin();
}
@Override
public void setPostalTown(String postalTown) {
user.setPostalTown(postalTown);
}
@Override
public String getPostalTown() {
return user.getPostalTown();
}
@Override
public void setGender(Gender gender) {
user.setGender(gender);
}
@Override
public Gender getGender() {
return user.getGender();
}
@Override
public void setCurrentImage(UserImage currentImage) {
user.setCurrentImage(currentImage);
}
@Override
public UserImage getCurrentImage() {
return user.getCurrentImage();
}
@Override
public boolean isAnonymous() {
return user.isAnonymous();
}
@Override
public Calendar getCreated() {
return user.getCreated();
}
......
package fi.insomnia.bortal.model;
import java.util.Date;
import javax.annotation.Generated;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-13T00:35:53.118+0300")
@Generated(value="Dali", date="2012-09-27T09:58:55.015+0300")
@StaticMetamodel(EventUser.class)
public class EventUser_ extends GenericEntity_ {
public static volatile SingularAttribute<EventUser, User> user;
......@@ -23,4 +24,6 @@ public class EventUser_ extends GenericEntity_ {
public static volatile ListAttribute<EventUser, Bill> bills;
public static volatile ListAttribute<EventUser, AccountEvent> soldItems;
public static volatile ListAttribute<EventUser, PollAnswer> pollAnswers;
public static volatile SingularAttribute<EventUser, EventUser> creator;
public static volatile SingularAttribute<EventUser, Date> eventuserCreated;
}
......@@ -16,7 +16,6 @@ import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
......@@ -25,7 +24,9 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
*
*/
@Entity
@Table(name = "group_memberships", uniqueConstraints = { @UniqueConstraint(columnNames = { GroupMembership.EVENTUSER_ID, GroupMembership.GROUP_ID }) })
@Table(name = "group_memberships")
// , uniqueConstraints = { @UniqueConstraint(columnNames = {
// GroupMembership.EVENTUSER_ID, GroupMembership.GROUP_ID }) })
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class GroupMembership extends GenericEntity {
......
package fi.insomnia.bortal.model;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import fi.insomnia.bortal.enums.Gender;
......@@ -29,9 +30,9 @@ public interface IUser {
public abstract void setFirstnames(String firstnames);
public abstract Calendar getBirthday();
public abstract Date getBirthday();
public abstract void setBirthday(Calendar birthday);
public abstract void setBirthday(Date birthday);
public abstract String getNick();
......
......@@ -5,6 +5,9 @@ public enum LanEventPrivatePropertyKey {
VERKKOMAKSU_KEY_EXPIRE(Type.DATE, null),
VERKKOMAKSU_MERCHANT_ID(Type.TEXT, null),
VERKKOMAKSU_MERCHANT_PASSWORD(Type.TEXT, null),
CHECKOUT_FI_MERCHANT_PASSWORD(Type.TEXT, null),
CHECKOUT_FI_MERCHANT_ID(Type.TEXT, null),
CHECKOUT_FI_KEY_EXPIRE(Type.DATE, null),
;
private enum Type {
......
......@@ -6,7 +6,7 @@ import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-08-23T03:32:15.378+0300")
@Generated(value="Dali", date="2012-08-25T03:50:15.426+0300")
@StaticMetamodel(LanEventPrivateProperty.class)
public class LanEventPrivateProperty_ extends GenericEntity_ {
public static volatile SingularAttribute<LanEventPrivateProperty, EventOrganiser> eventorg;
......
......@@ -6,7 +6,8 @@ public enum LanEventPropertyKey {
INVITEMAIL_CONTENT(Type.TEXT, "You have been invited to Stream demoparty by {1}.\n\nYou can register to stream demparty intranet at: {0}\n\nAfter registering to the intranet you can buy a ticket to Stream demoparty reduced price and invite your friends to join the party with you. More information can be found in the intranet. Remember also to visit our website at http://www.streamparty.org and join us at #streamparty in IRCNet. If you have any questions about this mail, registering to intranet, or anything else regarding Stream demoparty, please send us email to info@streamparty.org\n\n-- \nStream organizing\ninfo@streamparty.org"),
PORTAL_EMAIL_ADDRESS(Type.TEXT, "intra@streamparty.org"),
PORTAL_EMAIL_NAME(Type.TEXT, "Streamparty intranet"),
ADMIN_MAIL(Type.TEXT, "intra@streamparty.org"), ;
ADMIN_MAIL(Type.TEXT, "intra@streamparty.org"),
EVENT_LAYOUT(Type.TEXT, "template1"), ;
private enum Type {
TEXT, DATE, DATA
};
......
......@@ -5,7 +5,7 @@ import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-12T19:23:44.258+0300")
@Generated(value="Dali", date="2012-09-11T02:27:08.849+0300")
@StaticMetamodel(LogEntry.class)
public class LogEntry_ extends GenericEntity_ {
public static volatile SingularAttribute<LogEntry, LanEvent> parentEvent;
......
......@@ -76,6 +76,9 @@ public class Product extends GenericEntity {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private List<Place> places;
@ManyToMany()
private List<ProductLimitation> productLimits;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private List<AccountEvent> accountEvents;
......@@ -262,4 +265,12 @@ public class Product extends GenericEntity {
this.productFlags = productFlags;
}
public List<ProductLimitation> getProductLimits() {
return productLimits;
}
public void setProductLimits(List<ProductLimitation> productLimits) {
this.productLimits = productLimits;
}
}
package fi.insomnia.bortal.model;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
@Entity
@Table(name = "product_limitations")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class ProductLimitation extends GenericEntity {
/**
*
*/
private static final long serialVersionUID = 1373535658851118597L;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private ProductLimitationType type;
@Column(nullable = false)
private boolean last = false;
private String name;
@Lob
private String description;
@Column(nullable = false)
private Integer sort = 100;
@ManyToMany(mappedBy = "productLimits")
private List<Product> products;
@Column(nullable = true, precision = 24, scale = 4)
private BigDecimal upperLimit;
@Column(nullable = true, precision = 24, scale = 4)
private BigDecimal lowerLimit;
@ManyToMany()
private List<Role> matchingRoles;
public ProductLimitationType getType() {
return type;
}
public void setType(ProductLimitationType type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
public BigDecimal getUpperLimit() {
return upperLimit;
}
public void setUpperLimit(BigDecimal upperLimit) {
this.upperLimit = upperLimit;
}
public BigDecimal getLowerLimit() {
return lowerLimit;
}
public void setLowerLimit(BigDecimal lowerLimit) {
this.lowerLimit = lowerLimit;
}
public List<Role> getMatchingRoles() {
return matchingRoles;
}
public void setMatchingRoles(List<Role> matchingRoles) {
this.matchingRoles = matchingRoles;
}
}
package fi.insomnia.bortal.model;
public enum ProductLimitationType {
GLOBAL_BILLED, GLOBAL_BILL_PAID, GLOBAL_ACCOUNTEVENTS, USER_BILLED, USER_BILL_PAID, USER_ACCOUNTEVENTS,
}
package fi.insomnia.bortal.model;
import java.math.BigDecimal;
import javax.annotation.Generated;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-09-05T23:16:12.829+0300")
@StaticMetamodel(ProductLimitation.class)
public class ProductLimitation_ extends GenericEntity_ {
public static volatile SingularAttribute<ProductLimitation, ProductLimitationType> type;
public static volatile SingularAttribute<ProductLimitation, Boolean> last;
public static volatile SingularAttribute<ProductLimitation, String> name;
public static volatile SingularAttribute<ProductLimitation, String> description;
public static volatile SingularAttribute<ProductLimitation, Integer> sort;
public static volatile ListAttribute<ProductLimitation, Product> products;
public static volatile SingularAttribute<ProductLimitation, BigDecimal> upperLimit;
public static volatile SingularAttribute<ProductLimitation, BigDecimal> lowerLimit;
public static volatile ListAttribute<ProductLimitation, Role> matchingRoles;
}
......@@ -7,7 +7,7 @@ import javax.persistence.metamodel.SetAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-08-24T01:13:32.136+0300")
@Generated(value="Dali", date="2012-09-05T21:51:25.846+0300")
@StaticMetamodel(Product.class)
public class Product_ extends GenericEntity_ {
public static volatile SingularAttribute<Product, LanEvent> event;
......@@ -19,6 +19,7 @@ public class Product_ extends GenericEntity_ {
public static volatile SetAttribute<Product, ProductFlag> productFlags;
public static volatile SingularAttribute<Product, Role> provides;
public static volatile ListAttribute<Product, Place> places;
public static volatile ListAttribute<Product, ProductLimitation> productLimits;
public static volatile ListAttribute<Product, AccountEvent> accountEvents;
public static volatile ListAttribute<Product, Discount> discounts;
public static volatile SingularAttribute<Product, BigDecimal> vat;
......
......@@ -14,6 +14,8 @@ import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
......@@ -49,6 +51,10 @@ public class Reader extends GenericEntity {
this.setEvent(ev);
}
@Column(nullable = false, name = "type")
@Enumerated(EnumType.STRING)
private ReaderType type;
public static final String EVENT_ID_COLUMN = "event_id";
@ManyToOne()
@JoinColumn(name = EVENT_ID_COLUMN, nullable = false)
......
package fi.insomnia.bortal.model;
public enum ReaderType {
RFID, BARCODE, IRIS, FINGERPRINT, BLOODTYPE
}
......@@ -6,9 +6,10 @@ import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-12T14:43:39.114+0300")
@Generated(value="Dali", date="2012-09-10T17:55:33.516+0300")
@StaticMetamodel(Reader.class)
public class Reader_ extends GenericEntity_ {
public static volatile SingularAttribute<Reader, ReaderType> type;
public static volatile SingularAttribute<Reader, LanEvent> event;
public static volatile SingularAttribute<Reader, Integer> gamepoints;
public static volatile SingularAttribute<Reader, Integer> maxEvents;
......
......@@ -17,7 +17,7 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
import org.eclipse.persistence.annotations.PrivateOwned;
@Entity
@Table(name = "site_pages", uniqueConstraints = @UniqueConstraint(columnNames = { "event_id", "name" }))
@Table(name = "site_pages", uniqueConstraints = @UniqueConstraint(columnNames = { SitePage.EVENT_ID_COLUMN, "name" }))
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class SitePage extends GenericEntity {
......
......@@ -5,7 +5,7 @@ import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-12T14:43:39.125+0300")
@Generated(value="Dali", date="2012-10-04T21:02:39.749+0300")
@StaticMetamodel(SitePage.class)
public class SitePage_ extends GenericEntity_ {
public static volatile SingularAttribute<SitePage, LanEvent> event;
......
package fi.insomnia.bortal.model;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
......@@ -37,7 +38,7 @@ public class User extends GenericEntity implements IUser {
public static final String ANONYMOUS_LOGINNAME = "anonymous";
private static final long serialVersionUID = -1632200627103418206L;
@Column(name = "created", nullable = false)
@Column(name = "created", nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar created = Calendar.getInstance();
......@@ -59,7 +60,7 @@ public class User extends GenericEntity implements IUser {
@Column(name = "birthday")
@Temporal(TemporalType.TIMESTAMP)
private Calendar birthday;
private Date birthday;
@Column(name = "nick")
private String nick = "";
......@@ -173,12 +174,12 @@ public class User extends GenericEntity implements IUser {
}
@Override
public Calendar getBirthday() {
public Date getBirthday() {
return birthday;
}
@Override
public void setBirthday(Calendar birthday) {
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
......
......@@ -2,12 +2,13 @@ package fi.insomnia.bortal.model;
import fi.insomnia.bortal.enums.Gender;
import java.util.Calendar;
import java.util.Date;
import javax.annotation.Generated;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-05-13T14:47:41.939+0300")
@Generated(value="Dali", date="2012-09-09T04:13:51.037+0300")
@StaticMetamodel(User.class)
public class User_ extends GenericEntity_ {
public static volatile SingularAttribute<User, Calendar> created;
......@@ -16,7 +17,7 @@ public class User_ extends GenericEntity_ {
public static volatile SingularAttribute<User, String> password;
public static volatile SingularAttribute<User, String> lastname;
public static volatile SingularAttribute<User, String> firstnames;
public static volatile SingularAttribute<User, Calendar> birthday;
public static volatile SingularAttribute<User, Date> birthday;
public static volatile SingularAttribute<User, String> nick;
public static volatile SingularAttribute<User, String> email;
public static volatile SingularAttribute<User, String> address;
......
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1.2">
<attributes>
<attribute name="owner.project.facets" value="java"/>
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1.2">
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_05">
<attributes>
<attribute name="owner.project.facets" value="jst.web"/>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6
......@@ -5,7 +5,6 @@ import java.util.TimeZone;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
......@@ -14,10 +13,9 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.beans.RoleBeanLocal;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.IUser;
import fi.insomnia.bortal.model.EventUser;
@Named()
@RequestScoped
......@@ -26,11 +24,11 @@ public class SessionHandler {
private static final Logger logger = LoggerFactory
.getLogger(SessionHandler.class);
//@Inject
//private HttpServletRequest httprequest;
// @Inject
// private HttpServletRequest httprequest;
//@EJB
//private RoleBeanLocal rolebean;
// @EJB
// private RoleBeanLocal rolebean;
@EJB
private EventBeanLocal eventbean;
......@@ -45,14 +43,14 @@ public class SessionHandler {
public String getLocale() {
// TODO: Locale selection code missing
// return "en_ST_v7";
//return "fi_IN_XIII";
// return "fi_IN_XIII";
return "fi_FI";
}
public String getLayout() {
// TODO: layout selection code missing!!
// return "stream1";
//return "insomnia2";
// return "insomnia2";
return "default";
}
......@@ -81,11 +79,11 @@ public class SessionHandler {
}
public boolean isSuperadmin() {
return permbean.getCurrentUser().isSuperadmin();
return permbean.getCurrentUser().getUser().isSuperadmin();
}
public IUser getCurrentUser() {
public EventUser getCurrentUser() {
return permbean.getCurrentUser();
}
......
......@@ -7,7 +7,6 @@ import javax.inject.Named;
import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.beans.SalesEntitySessionBeanLocal;
import fi.insomnia.bortal.beans.SalespointContainerBeanLocal;
import fi.insomnia.bortal.salespoint.CartItem;
import fi.insomnia.bortal.salespoint.SalespointSessionManager;
......@@ -15,24 +14,24 @@ import fi.insomnia.bortal.salespoint.SalespointSessionManager;
public class CartView extends AbstractView {
private static final long serialVersionUID = 9041477262092320847L;
@EJB
SalesEntitySessionBeanLocal sessionBean;
private transient SalesEntitySessionBeanLocal sessionBean;
public CartItem[] getItems() throws IllegalStateException {
SalespointSessionManager sessionManager = sessionBean.getSessionManager();
return new CartItem[] { new CartItem(), new CartItem() };
}
public BigDecimal getTotal() throws IllegalStateException {
CartItem[] cartItems = getItems();
BigDecimal result = new BigDecimal(0);
for (int i = 0; i < cartItems.length; i++) {
result = result.add(cartItems[i].getTotal());
}
return result;
}
}
......@@ -14,14 +14,14 @@ import fi.insomnia.bortal.beans.PermissionBeanLocal;
@Named
@RequestScoped
public class TestView implements Serializable {
private static final long serialVersionUID = -2872232867536069020L;
private static final Logger logger = LoggerFactory.getLogger(TestView.class);
@EJB
private PermissionBeanLocal permissionBean;
private transient PermissionBeanLocal permissionBean;
public String getPrincipal() {
logger.debug("PermissionBean: {}", permissionBean);
return permissionBean.getPrincipal();
......
......@@ -7,10 +7,6 @@
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
......@@ -16,7 +16,7 @@
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
<arguments>
</arguments>
</buildCommand>
......@@ -25,6 +25,11 @@
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
......@@ -32,5 +37,6 @@
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.axdt.as3.imp.nature</nature>
<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
</natures>
</projectDescription>
Manifest-Version: 1.0
Class-Path: commons-codec-1.6.jar
Class-Path: commons-codec-1.6.jar
barcode4j.jar
PDFjet.jar
package fi.insomnia.bortal.utilities;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.krysalis.barcode4j.BarcodeDimension;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.impl.upcean.EAN13Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
public class BarcodeUtils {
public static InputStream getBarcode(String message) throws IOException {
// BarcodeGenerator bean = new DataMatrixBean();
BarcodeGenerator bean = new Code128Bean();
ByteArrayOutputStream out = new ByteArrayOutputStream();
// System.out.println("created: " + (new Date().getTime() - start));
BitmapCanvasProvider canvas = new BitmapCanvasProvider(
out, "image/png", 150, BufferedImage.TYPE_BYTE_BINARY, false, 0);
canvas.establishDimensions(new BarcodeDimension(200, 15));
bean.generateBarcode(canvas, message);
canvas.finish();
ByteArrayInputStream istream = new ByteArrayInputStream(out.toByteArray());
return istream;
}
public static InputStream getBarcodeEAN(String message) throws IOException {
// BarcodeGenerator bean = new DataMatrixBean();
BarcodeGenerator bean = new EAN13Bean();
ByteArrayOutputStream out = new ByteArrayOutputStream();
// System.out.println("created: " + (new Date().getTime() - start));
BitmapCanvasProvider canvas = new BitmapCanvasProvider(
out, "image/png", 150, BufferedImage.TYPE_BYTE_BINARY, false, 0);
canvas.establishDimensions(new BarcodeDimension(200, 15));
bean.generateBarcode(canvas, message);
canvas.finish();
ByteArrayInputStream istream = new ByteArrayInputStream(out.toByteArray());
return istream;
}
// public void barcode4j() throws FileNotFoundException, Exception {
// long start = new Date().getTime();
//
// File outFile = new File("/tmp/rairai2.pdf");
// PDF pdf = new PDF(new FileOutputStream(outFile));
// System.out.println("pre CreateCode: " + (new Date().getTime() - start));
//
// BarcodeGenerator bean = new DataMatrixBean();
//
// ByteArrayOutputStream out = new ByteArrayOutputStream();
// System.out.println("created: " + (new Date().getTime() - start));
//
// BitmapCanvasProvider canvas = new BitmapCanvasProvider(
// out, "image/png", 150, BufferedImage.TYPE_BYTE_BINARY, false, 0);
//
// bean.generateBarcode(canvas, "Foobar Rairai");
// canvas.finish();
//
// ByteArrayInputStream istream = new
// ByteArrayInputStream(out.toByteArray());
//
// Image img = new Image(pdf, istream, ImageType.PNG);
// Page page = new Page(pdf, A4.PORTRAIT);
// img.drawOn(page);
// System.out.println("post draw: " + (new Date().getTime() - start));
//
// pdf.flush();
// System.out.println("post flush: " + (new Date().getTime() - start));
//
// }
// public String asdasd() throws FileNotFoundException, Exception {
// long start = new Date().getTime();
// JBarcode code = JBarcodeFactory.getInstance().createCode128();
// System.out.println("pre CreateCode: " + (new Date().getTime() - start));
//
// BufferedImage barcode = code.createBarcode("Foobar Rairai");
// System.out.println("created: " + (new Date().getTime() - start));
// ImageIO.write(barcode, "JPEG", new File("/tmp/rairai.jpeg"));
// System.out.println("To File: " + (new Date().getTime() - start));
//
// File out = new File("/tmp/rairai2.pdf");
// PDF pdf = new PDF(new FileOutputStream(out));
//
// System.out.println("Pre stream: " + (new Date().getTime() - start));
//
// ByteArrayOutputStream jpegstream = new ByteArrayOutputStream();
// ImageIO.write(barcode, "JPEG", jpegstream);
// System.out.println("post stream: " + (new Date().getTime() - start));
//
// ByteArrayInputStream istream = new
// ByteArrayInputStream(jpegstream.toByteArray());
// System.out.println("post istream: " + (new Date().getTime() - start));
//
// Page page = new Page(pdf, A4.PORTRAIT);
//
// Image img = new Image(pdf, istream, ImageType.JPEG);
// img.drawOn(page);
// System.out.println("post draw: " + (new Date().getTime() - start));
//
// pdf.flush();
// System.out.println("post flush: " + (new Date().getTime() - start));
//
// return "";
// }
//
// public static void main(String[] args) {
// BarcodeUtils bb = new BarcodeUtils();
// try {
// bb.barcode4j();
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}
......@@ -6,6 +6,7 @@ import java.security.NoSuchAlgorithmException;
import java.util.Random;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -18,6 +19,47 @@ public class PasswordFunctions {
private static final boolean UGLY_FIX = true;
/**
* Returns the MD5 sum of the @param fields separated by @param separator e
* eg separator = "+" fields {"ONE", "TWO", "THREE"} return value
* ONE+TWO+THREE
*
* @param separator
* @param fields
* @return
*/
public static String calculateMd5(String separator, String... fields)
{
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String field : fields)
{
if (first) {
first = false;
} else {
sb.append(separator);
}
sb.append(field);
}
logger.info("Calculating md5 from {}", sb.toString());
return calculateMd5(sb.toString());
}
public static String calculateMd5(String str)
{
String ret = null;
try {
final MessageDigest algo = MessageDigest.getInstance("MD5");
final byte[] resultByte = algo.digest(str.getBytes());
ret = new String(Hex.encodeHex(resultByte)).toUpperCase();
} catch (NoSuchAlgorithmException e) {
logger.warn("THIS SHOULD NEVER HAPPEN! (md5 hashfunction should always exist)", e);
}
return ret;
}
public static String getEncryptedPassword(String password) {
byte[] salt = new byte[SALT_LENGTH];
Random random = new Random();
......
package fi.insomnia.bortal.utilities;
import java.io.Serializable;
public class SearchQuery implements Serializable {
private static final long serialVersionUID = -8777921789916093938L;
private int page = 0;
private int pagesize = 20;
private String sort = null;
private String search = null;
public SearchQuery()
{
super();
}
public SearchQuery(int page, int pagesize, String sort, String search) {
super();
this.page = page;
this.pagesize = pagesize;
this.sort = sort;
this.search = search;
}
public int getPage() {
return page;
}
public void setPage(int page) {
if (page < 0) {
this.page = 0;
} else
{
this.page = page;
}
}
public int getPagesize() {
if (pagesize < 1) {
pagesize = 20;
}
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getSearch() {
return search;
}
public void setSearch(String search) {
this.search = search;
}
public void addPage(Integer count) {
if (count != null) {
page += count;
}
}
}
......@@ -8,10 +8,7 @@
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/lib-AuthModule-depends"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
......@@ -21,6 +21,16 @@
</arguments>
</buildCommand>
<buildCommand>
<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.jboss.tools.cdi.core.cdibuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
......@@ -32,5 +42,7 @@
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
<nature>org.jboss.tools.cdi.core.cdinature</nature>
</natures>
</projectDescription>
#Sun Mar 27 01:20:35 EET 2011
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6
default.configuration=
eclipse.preferences.version=1
hibernate3.enabled=false
......@@ -26,9 +26,9 @@
<bill:showBill bill="#{billEditView.bill}" />
<ui:fragment rendered="#{!billEditView.bill.paid and billEditView.verkkomaksuAvailable}">
<ui:fragment rendered="#{!billEditView.bill.paid and billEditView.verkkomaksuFiAvailable}">
<div id="svm-payment">
<a href="#{billEditView.verkkomaksuToken.url}"> </a>
<a href="#{billEditView.verkkomaksuFiToken.url}"> </a>
</div>
<script type="text/javascript" src="//payment.verkkomaksut.fi/js/sv-widget.min.js"></script>
<script type="text/javascript">
......@@ -38,7 +38,25 @@
});
</script>
</ui:fragment>
<ui:fragment rendered="#{!billEditView.bill.paid and billEditView.checkoutFiAvailable}">
<table border="0">
<tr>
<ui:repeat varStatus="idx" value="#{billEditView.checkoutFiToken}" var="bank">
<td>
<form action="#{bank.url}" method="post">
<ui:repeat value="#{bank.postParams}" var="valp">
<input type="hidden" name="#{valp.key}" value="#{valp.value}" />
</ui:repeat>
<input type='image' src='#{bank.icon}' />
</form>
</td>
<h:outputText escape="false" value="&lt;/tr>&lt;tr>" rendered="#{idx.index % 4 == 3}" />
</ui:repeat>
</tr>
</table>
</ui:fragment>
</ui:define>
</ui:composition>
......
No preview for this file type
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!