Commit edf86cf5 by Tuukka Kivilahti

littlebit barcode refactoring, more to come

1 parent 0708a0e5
...@@ -40,6 +40,9 @@ public class BootstrapBean implements BootstrapBeanLocal { ...@@ -40,6 +40,9 @@ public class BootstrapBean implements BootstrapBeanLocal {
dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN event_users_id integer REFERENCES event_users(id) DEFAULT null;"}); dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN event_users_id integer REFERENCES event_users(id) DEFAULT null;"});
dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN places_id integer REFERENCES places(id) DEFAULT null;"}); dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN places_id integer REFERENCES places(id) DEFAULT null;"});
dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN products_id integer REFERENCES products(id) DEFAULT null;"}); dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN products_id integer REFERENCES products(id) DEFAULT null;"});
dbUpdates.add(new String[] { "ALTER TABLE reader_events ADD COLUMN type text NOT NULL;"});
dbUpdates.add(new String[] { "ALTER TABLE reader_events DROP COLUMN gamepoint;"});
} }
@EJB @EJB
......
...@@ -19,9 +19,12 @@ import fi.codecrew.moya.facade.ReaderFacade; ...@@ -19,9 +19,12 @@ import fi.codecrew.moya.facade.ReaderFacade;
import fi.codecrew.moya.model.AccountEvent; import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.CardTemplate; import fi.codecrew.moya.model.CardTemplate;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PrintedCard; import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Reader; import fi.codecrew.moya.model.Reader;
import fi.codecrew.moya.model.ReaderEvent; import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.model.ReaderEventType;
import fi.codecrew.moya.model.ReaderType; import fi.codecrew.moya.model.ReaderType;
import fi.codecrew.moya.model.User; import fi.codecrew.moya.model.User;
...@@ -47,143 +50,104 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -47,143 +50,104 @@ public class ReaderBean implements ReaderBeanLocal {
private CardTemplateBean cardTemplateBean; private CardTemplateBean cardTemplateBean;
@EJB @EJB
private ProductPBean productPBean; private ProductPBean productPBean;
@EJB
private BarcodeBeanLocal barcodeBean;
private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class); private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);
@Override @Override
public ReaderEvent checkTag(String readerIdent, String tag) { public ReaderEvent checkCode(String readerIdent, String code) {
Reader reader = readerfacade.findOrCreateByIdent(readerIdent); Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
tag = tag.replace("\"\b", ""); code = code.replace("\"\b", "");
if (reader.getType() == ReaderType.RFID) { if (reader.getType() == ReaderType.RFID) {
if (Pattern.matches("^.*000000$", tag)) if (Pattern.matches("^.*000000$", code))
{ {
tag = tag.replace("000000", ""); code = code.replace("000000", "");
} }
StringBuilder sb = new StringBuilder(tag); StringBuilder sb = new StringBuilder(code);
while (sb.length() < 16) while (sb.length() < 16)
{ {
sb.insert(0, "0"); sb.insert(0, "0");
} }
tag = sb.toString(); code = sb.toString();
} }
PrintedCard card = cardfacade.findByRfid(tag);
ReaderEvent event = new ReaderEvent(new Date(), reader, code);
logger.info("reader {}, card {}", reader, card);
// RfidEvent revent = reventcontainer.foundTag(reader, tag); // first, check if dublicate, there is 30s timeout for dublicates, afther that it's ok to create dublicate
// that's bcause accident dublicates are bad, but otherwise it's probably bcause user want's to read it again
List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1); List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
ReaderEvent ret = null;
if (!lastevents.isEmpty() && !reader.isAutoproduct()) if (!lastevents.isEmpty() && !reader.isAutoproduct())
{ {
ReaderEvent lastevent = lastevents.get(0); ReaderEvent lastevent = lastevents.get(0);
if (card == null)
{ if(lastevent.getValue() == event.getValue() && (lastevent.getUpdatetime().getTime() + 60000l) > event.getTime().getTime()) {
if (lastevent.getPrintedCard() == null && tag.equals(lastevent.getValue())) return lastevent; // todo: update lastevent bfore return
{
ret = lastevent;
}
} else if (card.equals(lastevent.getPrintedCard())) {
ret = lastevent;
} }
} }
if (ret == null)
{
ret = createReaderEvent(reader, card); // find stuff with barcode and set type
logger.debug("Got reader autoproduct {} with count {}", reader.getAutomaticProduct(), reader.getAutomaticProductCount()); // IF we find 2 stuff with same barcode, it's just bad luck and things may be little random.
logger.debug("ret {}, card, {} autoproduct {}", new Object[] { ret, card, reader.isAutoproduct() }); EventUser user = barcodeBean.getUser(code);
if (ret != null && card != null && reader.isAutoproduct()) {
EventUser eu = userbean.getEventUser(card.getUser().getUser()); if(user != null) {
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, Calendar.getInstance()); event.setType(ReaderEventType.USER);
readerfacade.flush(); event.setUser(user);
logger.info("Creating new accountevent from autoproduct {}", createAc); }
ret.setNotes("Created automatic account event from reader. " + createAc);
PrintedCard card = barcodeBean.getPrintedCard(code);
if(card != null) {
event.setType(ReaderEventType.CARD);
event.setPrintedCard(card);
if(card.getUser() != null) {
event.setUser(card.getUser());
} }
} else {
ret.setUpdatetime(new Date());
} }
if (card == null)
{ Product product = barcodeBean.getProduct(code);
ret.setValue(tag);
if(product != null) {
event.setType(ReaderEventType.PRODUCT);
event.setProduct(product);
} }
return ret;
Place place = barcodeBean.getPlaceFromBarcode(code);
}
if(place != null) {
// event.setType(ReaderEventType.PLACE);
// @Override event.setPlace(place);
// public ReaderEvent assocTagToPlacecode(String tag, String readerIdent,
// String placecode) throws BortalCatchableException,
// PermissionDeniedException {
//
// GroupMembership gm = gmfacade.findByToken(placecode);
// if (gm == null) {
// throw new BortalCatchableException("Token" + placecode + " not found!",
// "readerbean.tokenNotFound");
// }
// if (gm.getUser() == null) {
// throw new BortalCatchableException("Token " + placecode +
// "found but not assoc to user!",
// "readerbean.userNotAssociateToMembership");
// }
//
// PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser());
//
// Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
//
// return createReaderEvent(reader, card);
//
// }
private ReaderEvent createReaderEvent(Reader reader, PrintedCard card) {
ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);
Integer gamepoints = reader.getGamepoints();
if (gamepoints > 0 && card != null) {
int awardedCount = 0;
for (ReaderEvent oldRe : reader.getEvents()) {
if (oldRe.getGamePoint() > 0)
{
++awardedCount;
// User has been already awarded points from this reader.
// Not awarding again...
if (oldRe.getPrintedCard().equals(card)) {
gamepoints = 0;
break;
}
}
}
// if points can be awarded only limited times...
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() > awardedCount) {
gamepoints = 0;
}
} }
event.setUpdatetime(new Date());
// reader is in autoproduct-mode, create dat product
if (reader.isAutoproduct()) {
EventUser eu = userbean.getEventUser(card.getUser().getUser());
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, Calendar.getInstance());
readerfacade.flush();
logger.info("Creating new accountevent from autoproduct {}", createAc);
event.setNotes("Created automatic account event from reader. " + createAc);
ret.setGamePoint(gamepoints);
reader.getEvents().add(ret);
if (card != null)
{
card.getReaderEvents().add(ret);
} }
return ret; return event;
} }
@Override @Override
public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) { public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {
......
...@@ -39,6 +39,6 @@ public interface ReaderBeanLocal { ...@@ -39,6 +39,6 @@ public interface ReaderBeanLocal {
List<ReaderEvent> getLastReaderEvents(); List<ReaderEvent> getLastReaderEvents();
ReaderEvent checkTag(String readerIdent, String tag); ReaderEvent checkCode(String readerIdent, String code);
} }
...@@ -23,14 +23,6 @@ import org.eclipse.persistence.annotations.OptimisticLockingType; ...@@ -23,14 +23,6 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS) @OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class ReaderEvent extends GenericEntity { public class ReaderEvent extends GenericEntity {
public enum Type {
USER,
PLACE,
CARD,
PRODUCT,
UNKNOWN
}
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Column(name = "event_time", nullable = false) @Column(name = "event_time", nullable = false)
...@@ -48,9 +40,6 @@ public class ReaderEvent extends GenericEntity { ...@@ -48,9 +40,6 @@ public class ReaderEvent extends GenericEntity {
@Column(name = "notes") @Column(name = "notes")
private String notes; private String notes;
@Column(nullable = false)
private Integer gamePoint = 0;
@JoinColumn(name = "printed_cards_id", referencedColumnName = "id", nullable = true, updatable = false) @JoinColumn(name = "printed_cards_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false) @ManyToOne(optional = false)
private PrintedCard printedCard; private PrintedCard printedCard;
...@@ -71,7 +60,41 @@ public class ReaderEvent extends GenericEntity { ...@@ -71,7 +60,41 @@ public class ReaderEvent extends GenericEntity {
@ManyToOne(optional = false) @ManyToOne(optional = false)
private Product product; private Product product;
private Type type; private ReaderEventType type;
public ReaderEvent(Date eventTime, Reader reader, String value) {
this(eventTime, reader, value, null, null, null, null, ReaderEventType.UNKNOWN);
}
public ReaderEvent(Date eventTime, Reader reader, String value, ReaderEventType type) {
this(eventTime, reader, value, null, null, null, null, type);
}
public ReaderEvent(Date eventTime, Reader reader, String value, PrintedCard card, EventUser user, Place place, Product product, ReaderEventType type) {
this.time = eventTime;
this.reader = reader;
this.value = value;
this.user = user;
this.printedCard = card;
this.user = user;
this.place = place;
this.product = product;
if (type == null)
type = ReaderEventType.UNKNOWN;
this.type = type;
}
public ReaderEvent() {
super();
}
public EventUser getUser() { public EventUser getUser() {
return user; return user;
...@@ -97,48 +120,14 @@ public class ReaderEvent extends GenericEntity { ...@@ -97,48 +120,14 @@ public class ReaderEvent extends GenericEntity {
this.product = product; this.product = product;
} }
public Type getType() { public ReaderEventType getType() {
return type; return type;
} }
public void setType(Type type) { public void setType(ReaderEventType type) {
this.type = type; this.type = type;
} }
public ReaderEvent(Calendar eventTime, Reader reader, String value) {
this(eventTime, reader, value, null, null, null, null, Type.UNKNOWN);
}
public ReaderEvent(Calendar eventTime, Reader reader, String value, Type type) {
this(eventTime, reader, value, null, null, null, null, type);
}
public ReaderEvent(Calendar eventTime, Reader reader, String value, PrintedCard card, EventUser user, Place place, Product product, Type type) {
this.time = eventTime.getTime();
this.reader = reader;
this.value = value;
this.user = user;
this.printedCard = card;
this.user = user;
this.place = place;
this.product = product;
if (type == null)
type = Type.UNKNOWN;
this.type = type;
}
public ReaderEvent() {
super();
}
public String getNotes() { public String getNotes() {
return notes; return notes;
} }
...@@ -179,14 +168,6 @@ public class ReaderEvent extends GenericEntity { ...@@ -179,14 +168,6 @@ public class ReaderEvent extends GenericEntity {
this.reader = readersId; this.reader = readersId;
} }
public void setGamePoint(Integer gamePoint) {
this.gamePoint = gamePoint;
}
public Integer getGamePoint() {
return gamePoint;
}
public Date getUpdatetime() { public Date getUpdatetime() {
if (updatetime == null) if (updatetime == null)
return time; return time;
......
package fi.codecrew.moya.model;
public enum ReaderEventType {
USER,
PLACE,
CARD,
PRODUCT,
UNKNOWN
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!