Commit a4b7a50c by Liv Haapala

Merge branch 'master' of gitlab.codecrew.fi:codecrew/moya

Conflicts:
	code/MoyaBeans/ejbModule/fi/codecrew/moya/beans/BootstrapBean.java
	code/MoyaDatabase/src/META-INF/persistence.xml
2 parents 4ba6b779 e37aec49
Showing with 1481 additions and 87 deletions
......@@ -244,10 +244,6 @@ public class BillBean implements BillBeanLocal {
if (prod != null && prod.getProductFlags().contains(ProductFlag.PREPAID_INSTANT_CREATE)) {
logger.debug("Creating Bill prepaidInstant product {}, {}", prod.getName(), bl.getQuantity());
if (prod.getProductFlags().contains(ProductFlag.RESERVE_PLACE_WHEN_BOUGHT)
|| prod.getProductFlags().contains(ProductFlag.CREATE_NEW_PLACE_WHEN_BOUGHT)) {
placebean.lockPlaceProduct(bill.getUser(), prod, bl.getQuantity());
}
AccountEvent ac2 = productPBean.createAccountEvent(prod, bl.getQuantity(), user, bill.getSentDate(), bl.getFoodwave());
logger.info("Created ac from product. {}, userproducts {}", ac2, user.getAccountEvents().size());
......@@ -320,8 +316,6 @@ public class BillBean implements BillBeanLocal {
@Override
public Bill addProductToBill(Bill bill, Product product, BigDecimal count, FoodWave foodwave) {
// If bill number > 0 bill has been sent and extra privileges are needed
// to modify.
// if (!iscurrent || billnr != null) {
......@@ -342,7 +336,4 @@ public class BillBean implements BillBeanLocal {
return bill;
}
}
......@@ -23,6 +23,25 @@ public class BootstrapBean implements BootstrapBeanLocal {
public BootstrapBean() {
}
/**
* Runs a "ALTER TABLE
* <table>
* <statement>" for each of tables.
*
* @param alterStatement
* e.g. "ADD meta json"
* @param tables
* table name strings
* @return1
*/
private static final String[] alterTables(String alterStatement, String... tables) {
String[] strings = new String[tables.length];
for (int i = 0; i < tables.length; i++) {
strings[i] = "ALTER TABLE \"" + tables[i] + "\" " + alterStatement;
}
return strings;
}
private static final List<String[]> dbUpdates = new ArrayList<String[]>();
static {
// {"Query1","Query2",...}
......@@ -70,6 +89,78 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE card_text_data ADD COLUMN card_templates_id integer REFERENCES card_templates(id) DEFAULT null;",
"ALTER TABLE card_object_data ADD COLUMN card_templates_id integer REFERENCES card_templates(id) DEFAULT null;"
});
dbUpdates.add(alterTables("ADD COLUMN meta json",
"account_events",
"actionlog_message_responses",
"actionlog_message_tags",
"actionlog_messages",
"api_application_instances",
"api_applications",
"application_permissions",
"approvals",
"bill_lines",
"bills",
"card_code",
"card_templates",
"compo_entries",
"compo_entry_files",
"compo_entry_participations",
"compo_votes",
"compos",
"discount_instances",
"discounts",
"event_domains",
"event_log",
"event_log_types",
"event_organiser",
"event_private_properties",
"event_properties",
"event_users",
"events",
"feedback",
"food_wave_templates",
"food_waves",
"game_ids",
"group_memberships",
"groups",
"inventory_events",
"licensetargets",
"licensecodes",
"locations",
"maps",
"match_results",
"matches",
"menu_navigation",
"menuitem",
"news",
"news_groups",
"org_roles",
"places",
"poll",
"poll_answer",
"poll_question",
"possible_answer",
"printed_cards",
"product_limitations",
"products",
"reader_events",
"readers",
"roles",
"sales_entity",
"salespoint",
"site_page_content",
"site_pages",
"tournament_games",
"tournament_participants",
"tournament_rules",
"tournament_team_members",
"tournaments",
"user_approvals",
"user_images",
"user_notes",
"users"));
dbUpdates.add(new String[]{"CREATE TABLE network_associations (id SERIAL NOT NULL, create_time TIMESTAMPTZ NOT NULL, ip TEXT, mac TEXT, META TEXT, modify_time TIMESTAMPTZ NOT NULL, status TEXT NOT NULL, event INTEGER, event_user INTEGER, place INTEGER, PRIMARY KEY (id))"});
}
@EJB
......
......@@ -132,16 +132,24 @@ public class CardTemplateBean implements CardTemplateBeanLocal {
List<PrintedCard> myCards = printedcardfacade.getCards(user);
PrintedCard biggestCard = null;
PrintedCard smallestCard = null;
// PrintedCard smallestCard = null;
for (PrintedCard card : myCards) {
logger.info("Checking card {}", card);
// logger.info("Checking card {}", card);
if (card.getEnabled()) {
if (biggestCard == null || biggestCard.getTemplate().getPower() < card.getTemplate().getPower()) {
biggestCard = card;
// The biggest card should be the only one enabled.
if (biggestCard != null) {
biggestCard.setEnabled(false);
}
if (smallestCard == null || smallestCard.getTemplate().getPower() > card.getTemplate().getPower()) {
smallestCard = card;
biggestCard = card;
biggestCard.setEnabled(true);
}
// if (smallestCard == null ||
// smallestCard.getTemplate().getPower() >
// card.getTemplate().getPower()) {
// smallestCard = card;
// }
}
}
......
......@@ -150,11 +150,13 @@ public class JaasBean implements MoyaRealmBeanRemote {
}
private String restAuth(String restauth) {
String[] authsplit = restauth.split(":");
String[] authsplit = restauth.split(":", 6);
logger.info("Trying to auth with rest {}", (Object) authsplit);
if (authsplit.length != 6 || !authsplit[0].equals("rest")) {
return null;
}
return authenticateApp(authsplit[1], authsplit[2], authsplit[3], authsplit[4], authsplit[5]);
return authenticateApp(authsplit[5], authsplit[1], authsplit[2], authsplit[3], authsplit[4]);
}
@Override
......@@ -233,20 +235,33 @@ public class JaasBean implements MoyaRealmBeanRemote {
}
public String authenticateApp(String pathInfo, String appId, String userId, String appStamp, String mac) {
if (mac == null)
logger.info("Authenticat app with pathinfo {}, appid {}, userid {}, appstamp {}, mac {}",
pathInfo, appId, userId, appStamp, mac
);
if (mac == null) {
logger.warn("Rest auth failed: Mac is null");
return null;
}
ApiApplication app = appfacade.findByAppid(appId);
if (app == null)
if (app == null) {
logger.warn("Rest auth failed: Application not found for appid {}", appId);
return null;
}
ApiApplicationInstance apiInstance = appInstanceFacade.findInstance(app, userId);
if (apiInstance == null)
if (apiInstance == null) {
logger.warn("Rest auth failed; because appInstance not found for app{} and user {}", app, userId);
return null;
if (!app.isEnabled() || !apiInstance.isEnabled())
}
if (!app.isEnabled() || !apiInstance.isEnabled()) {
logger.warn("Rest auth failed: app or api-instance is disabled: app {}, apiInstance: {}", app, apiInstance);
return null;
}
String ret = null;
String macSource = PasswordFunctions.mkSeparatedString("+", pathInfo, appId, userId, appStamp, apiInstance.getSecretKey());
String macHash = PasswordFunctions.calculateSha1(macSource);
logger.info("Calculated hash {}, comparing to {}", macHash, mac);
if (mac.equalsIgnoreCase(macHash))
{
switch (app.getAuthtype()) {
......@@ -261,7 +276,10 @@ public class JaasBean implements MoyaRealmBeanRemote {
default:
throw new RuntimeException("Unknown application authtype!");
}
} else {
logger.warn("Rest auth failed: Calculated hash does not match received mac: Calculated {}, received {}", machash, mac);
}
return ret;
}
}
......@@ -17,6 +17,7 @@ import fi.codecrew.moya.enums.apps.ContentPermission;
import fi.codecrew.moya.enums.apps.EventPermission;
import fi.codecrew.moya.enums.apps.LicensePermission;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.enums.apps.NetworkAssociationPermission;
import fi.codecrew.moya.enums.apps.PollPermission;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission;
......@@ -195,6 +196,10 @@ public class MenuBean implements MenuBeanLocal {
adminEventCards.addPage(menuitemfacade.findOrCreate("/shop/shopToUser"), null).setVisible(false);
adminEventCards.addPage(menuitemfacade.findOrCreate("/shop/assocToUser"), null).setVisible(false);
MenuNavigation adminAssociation = adminmenu.addPage(null, null);
adminAssociation.setKey("topnavi.adminassoc");
adminAssociation.addPage(menuitemfacade.findOrCreate("/networkassociation/index"), NetworkAssociationPermission.CAN_ADMINISTER_ASSOCIATIONS);
// shop
MenuNavigation adminshop = adminmenu.addPage(null, null);
adminshop.setKey("topnavi.adminshop");
......
package fi.codecrew.moya.beans;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.codecrew.moya.enums.BortalApplication;
import fi.codecrew.moya.enums.NetworkAssociationStatus;
import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.enums.apps.NetworkAssociationPermission;
import fi.codecrew.moya.facade.NetworkAssociationFacade;
import fi.codecrew.moya.model.ApplicationPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
import fi.codecrew.moya.model.NetworkAssociation;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.Role;
/**
* Session Bean implementation class NetworkAssociationBean
*/
@Stateless
@LocalBean
public class NetworkAssociationBean implements NetworkAssociationBeanLocal {
@EJB
private UserBean userBean;
@EJB
private BarcodeBean barcodeBean;
@EJB
private RoleBean roleBean;
@EJB
private NetworkAssociationFacade networkAssociationFacade;
@EJB
private EventBean eventBean;
@EJB
private PermissionBean permissionBean;
public NetworkAssociationBean() {}
@Override
@RolesAllowed(NetworkAssociationPermission.S_CAN_ADMINISTER_ASSOCIATIONS)
public List<NetworkAssociation> getStatusByIPAndMAC(String ip, String mac) {
return networkAssociationFacade.findByIPAndMAC(eventBean.getCurrentEvent(), ip, mac);
}
@Override
@RolesAllowed(NetworkAssociationPermission.S_CAN_ADMINISTER_ASSOCIATIONS)
public List<NetworkAssociation> getActiveAssociations(boolean activatePending) {
if(activatePending)
activatePendingAssociations();
return networkAssociationFacade.findByStatus(eventBean.getCurrentEvent(), NetworkAssociationStatus.ACTIVE);
}
@Override
@RolesAllowed(NetworkAssociationPermission.S_CAN_ADMINISTER_ASSOCIATIONS)
public NetworkAssociation tryAssociate(String ip, String mac) {
EventUser eu = permissionBean.getCurrentUser();
HashSet<IAppPermission> userPerms = buildPermsFor(eu);
NetworkAssociation nasc = associate(eu, userPerms, null, ip, mac);
return nasc;
}
@Override
@RolesAllowed(NetworkAssociationPermission.S_CAN_ADMINISTER_ASSOCIATIONS)
public NetworkAssociation tryAssociate(String username, String password,
String ip, String mac, String code, boolean codeRequired)
throws Exception {
EventUser authUser = userBean.validateUser(username, password);
if(authUser == null)
throw new Exception("INVALID_USER_OR_PASSWORD");
NetworkAssociation association;
HashSet<IAppPermission> userPerms = buildPermsFor(authUser);
if(!userPerms.contains(NetworkAssociationPermission.CAN_ASSOCIATE))
throw new Exception("USER_HAS_NO_ASSOCIATE_PERMISSION");
if(codeRequired) {
Place place = resolvePlaceFromCode(code);
if(place == null) {
// This is a valid case when user has permissions that allow them to
// override any place requirements, effectively allowing for free
// associations without the need of a real place.
if(!userPerms.contains(NetworkAssociationPermission.OVERRIDE_PLACE_REQUIREMENT))
throw new Exception("INVALID_PLACECODE");
association = associate(authUser, userPerms, place, ip, mac);
} else {
if(place.getPlaceReserver().getUser().equals(authUser)) {
// This is the simple case when user goes to their own place
association = associate(authUser, userPerms, place, ip, mac);
} else {
// In this case, the user has probably shuffled their seats
// within their group
if(!userPerms.contains(NetworkAssociationPermission.CAN_SHUFFLE_IN_GROUP))
throw new Exception("INVALID_PLACECODE");
boolean userIsInGroup = false;
for(GroupMembership gm : place.getGroup().getMembers()) {
EventUser member = gm.getUser();
if(member != null && gm.getUser().equals(authUser)) {
userIsInGroup = true;
break;
}
}
if(!userIsInGroup)
throw new Exception("INVALID_PLACECODE");
association = associate(authUser, userPerms, place, ip, mac);
}
}
} else {
// Code was not required, this is often a case for WLAN
association = associate(authUser, userPerms, null, ip, mac);
}
return association;
}
@Override
@RolesAllowed(NetworkAssociationPermission.S_CAN_ADMINISTER_ASSOCIATIONS)
public List<NetworkAssociation> getPendingAssociations() {
return networkAssociationFacade.findByStatus(eventBean.getCurrentEvent(), NetworkAssociationStatus.PENDING);
}
@Override
@RolesAllowed(NetworkAssociationPermission.S_CAN_ADMINISTER_ASSOCIATIONS)
public void dropAssociationById(Integer associd) {
NetworkAssociation na = networkAssociationFacade.find(associd);
if(na.getEvent().equals(eventBean.getCurrentEvent())) {
na.setModifyTime(Calendar.getInstance());
na.setStatus(NetworkAssociationStatus.EXPIRED);
}
}
private HashSet<IAppPermission> buildPermsFor(EventUser authUser) {
HashSet<IAppPermission> userPerms = new HashSet<>();
if (authUser.getUser().isSuperadmin()) {
// Iterate through all permissions & add
for (BortalApplication app : BortalApplication.values()) {
for (IAppPermission perm : app.getPermissions()) {
userPerms.add(perm);
}
}
} else {
for(Role r : userBean.localFindUsersRoles(authUser)) {
for(ApplicationPermission appPerm : r.getPermissions()) {
IAppPermission iap = appPerm.getPermission();
if(!userPerms.contains(iap)) {
userPerms.add(iap);
}
}
}
}
return userPerms;
}
private void activatePendingAssociations() {
List<NetworkAssociation> netAssocs = networkAssociationFacade.findByStatus(
eventBean.getCurrentEvent(), NetworkAssociationStatus.PENDING);
for(NetworkAssociation na : netAssocs) {
na.setStatus(NetworkAssociationStatus.ACTIVE);
na.setModifyTime(Calendar.getInstance());
}
}
private NetworkAssociation associate(EventUser authUser, HashSet<IAppPermission> userPerms,
Place place, String ip, String mac) {
// This tests the case where association request is still pending, we will not
// create new one but rather return an old one
List<NetworkAssociation> nas = networkAssociationFacade.findByIPAndMACAndStatus(
eventBean.getCurrentEvent(), ip, mac, NetworkAssociationStatus.PENDING);
if(nas.size() > 0)
return nas.get(0);
nas = networkAssociationFacade.findByIPAndMACAndStatus(
eventBean.getCurrentEvent(), ip, mac, NetworkAssociationStatus.ACTIVE);
if(nas.size() > 0)
return nas.get(0);
NetworkAssociation na = new NetworkAssociation();
na.setIP(ip);
na.setMAC(mac);
na.setPlace(place);
na.setEventUser(authUser);
na.setEvent(authUser.getEvent());
na.setStatus(NetworkAssociationStatus.PENDING);
List<NetworkAssociation> activeAssocs;
if(place == null) {
// When in this branch, we are doing an association which will never
// dis-associate things EXCEPT in the case where IP collision happens
// which usually is a result of network ops change...
activeAssocs = networkAssociationFacade.findActiveAssociationsByIP(
eventBean.getCurrentEvent(), ip);
for(NetworkAssociation activeAssoc : activeAssocs) {
activeAssoc.setModifyTime(Calendar.getInstance());
activeAssoc.setStatus(NetworkAssociationStatus.EXPIRED);
}
} else {
// Disassociate any colliding IPs
activeAssocs = networkAssociationFacade.findActiveAssociationsByIP(
eventBean.getCurrentEvent(), ip);
for(NetworkAssociation activeAssoc : activeAssocs) {
activeAssoc.setModifyTime(Calendar.getInstance());
activeAssoc.setStatus(NetworkAssociationStatus.EXPIRED);
}
// In here we disassociate old associations from this place unless the user has many
// associations per place
if(!userPerms.contains(NetworkAssociationPermission.CAN_ASSOCIATE_MANY_PER_PLACE)) {
activeAssocs = networkAssociationFacade.findActiveAssociationsByPlace(place);
for(NetworkAssociation activeAssoc : activeAssocs) {
activeAssoc.setModifyTime(Calendar.getInstance());
activeAssoc.setStatus(NetworkAssociationStatus.EXPIRED);
}
}
}
// Finally persist the association and return
na = networkAssociationFacade.create(na);
return na;
}
private Place resolvePlaceFromCode(String code) {
if(code == null) return null;
return barcodeBean.getPlaceFromTextCode(code);
}
}
......@@ -315,6 +315,10 @@ public class PlaceBean implements PlaceBeanLocal {
logger.info("Associating buyer {} to place {}", user, gm);
associatedToPlace = true;
gm.setUser(user);
if (user.getGroupMemberships() == null) {
user.setGroupMemberships(new ArrayList<GroupMembership>());
}
user.getGroupMemberships().add(gm);
}
}
......@@ -346,7 +350,9 @@ public class PlaceBean implements PlaceBeanLocal {
freePlace = new Place();
freePlace.setProduct(prod);
freePlace.setProvidesRole(prod.getProvides());
freePlace.setName("-");
placeFacade.create(freePlace);
} else if (prod.getPlaces() != null) {
for (Place p : prod.getPlaces()) {
if (!p.isTaken()) {
......@@ -359,11 +365,16 @@ public class PlaceBean implements PlaceBeanLocal {
throw new EJBException("Could find a place to be reserved....");
}
GroupMembership gm = buy(freePlace, pg);
if (!associatedToPlace)
{
logger.info("Associating buyer {} to place {}", user, gm);
associatedToPlace = true;
gm.setUser(user);
if (user.getGroupMemberships() == null) {
user.setGroupMemberships(new ArrayList<GroupMembership>());
}
user.getGroupMemberships().add(gm);
}
}
......
......@@ -14,12 +14,14 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.facade.AccountEventFacade;
import fi.codecrew.moya.facade.ProductFacade;
import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.DiscountInstance;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.ProductFlag;
/**
* Session Bean implementation class ProductPBean
......@@ -35,6 +37,13 @@ public class ProductPBean {
private DiscountBean discountBean;
@EJB
private AccountEventFacade accounteventfacade;
@EJB
private PlaceBean placebean;
@EJB
private ProductFacade productFacade;
private static final Logger logger = LoggerFactory
.getLogger(ProductPBean.class);
......@@ -70,9 +79,12 @@ public class ProductPBean {
BigDecimal quantity, EventUser user, Calendar date,
FoodWave foodwave) {
if (!accounteventfacade.isAttached(product)) {
product = productFacade.reload(product);
}
if (!product.getEvent().equals(user.getEvent())) {
throw new EJBException(
"Trying to create accountevent for different event in user and product");
throw new EJBException("Trying to create accountevent for different event in user and product");
}
BigDecimal unitPrice = product.getPrice().negate();
......@@ -94,12 +106,21 @@ public class ProductPBean {
foodwave.getAccountEvents().add(ret);
}
if (product.getProductFlags().contains(ProductFlag.RESERVE_PLACE_WHEN_BOUGHT)
|| product.getProductFlags().contains(ProductFlag.CREATE_NEW_PLACE_WHEN_BOUGHT)) {
placebean.lockPlaceProduct(user, product, quantity);
}
List<DiscountInstance> accEventdiscounts = ret.getDiscountInstances();
for (Discount d : discounts) {
// discountsArray.add(discInst);
// discountinstancefacade.create(discInst);
accEventdiscounts.add(new DiscountInstance(ret, d));
}
if (product.getAccountEvents() == null) {
product.setAccountEvents(new ArrayList<AccountEvent>());
}
product.getAccountEvents().add(ret);
user.addAccountevent(ret);
accounteventfacade.create(ret);
......
......@@ -192,7 +192,7 @@ public class TournamentBean implements TournamentBeanLocal {
for (TournamentParticipant tp : tournament.getParticipants()) {
for (TournamentTeamMember tm : tp.getTeamMembers()) {
EventUser eu = tm.getEventUser();
System.out.println(eu.getNick());
if (eu.equals(currentUser)) {
return true;
}
......
......@@ -190,4 +190,9 @@ public class VotingBean implements VotingBeanLocal {
compoEntryFileFacade.create(cef);
}
@Override
public List<CompoEntry> getEntriesForCurrentUser() {
EventUser user = permissionBean.getCurrentUser();
return compoEntryFacade.findUsersEntries(user);
}
}
package fi.codecrew.moya.facade;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.model.CompoEntry;
import fi.codecrew.moya.model.CompoEntry_;
import fi.codecrew.moya.model.EventUser;
@Stateless
@LocalBean
......@@ -14,4 +21,11 @@ public class CompoEntryFacade extends IntegerPkGenericFacade<CompoEntry> {
super(CompoEntry.class);
}
public List<CompoEntry> findUsersEntries(EventUser user) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<CompoEntry> cq = cb.createQuery(CompoEntry.class);
Root<CompoEntry> root = cq.from(CompoEntry.class);
cq.where(cb.equal(root.get(CompoEntry_.creator), user));
return getEm().createQuery(cq).getResultList();
}
}
package fi.codecrew.moya.facade;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.enums.NetworkAssociationStatus;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.NetworkAssociation;
import fi.codecrew.moya.model.NetworkAssociation_;
import fi.codecrew.moya.model.Place;
@Stateless
@LocalBean
public class NetworkAssociationFacade extends IntegerPkGenericFacade<NetworkAssociation> {
public NetworkAssociationFacade() { super(NetworkAssociation.class); }
public List<NetworkAssociation> findByIPAndMACAndStatus(LanEvent event, String ip, String mac, NetworkAssociationStatus nas) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<NetworkAssociation> cq = cb.createQuery(NetworkAssociation.class);
Root<NetworkAssociation> root = cq.from(NetworkAssociation.class);
cq.where(
cb.and(
cb.equal(root.get(NetworkAssociation_.event), event),
cb.equal(root.get(NetworkAssociation_.ip), ip),
cb.equal(root.get(NetworkAssociation_.mac), mac),
cb.equal(root.get(NetworkAssociation_.status), nas)
)
);
return getEm().createQuery(cq).getResultList();
}
public List<NetworkAssociation> findActiveAssociationsByIP(LanEvent event, String ip) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<NetworkAssociation> cq = cb.createQuery(NetworkAssociation.class);
Root<NetworkAssociation> root = cq.from(NetworkAssociation.class);
cq.where(
cb.and(
cb.equal(root.get(NetworkAssociation_.event), event),
cb.or(
cb.equal(root.get(NetworkAssociation_.status), NetworkAssociationStatus.PENDING),
cb.equal(root.get(NetworkAssociation_.status), NetworkAssociationStatus.ACTIVE)
),
cb.equal(root.get(NetworkAssociation_.ip), ip)
)
);
return getEm().createQuery(cq).getResultList();
}
public List<NetworkAssociation> findActiveAssociationsByPlace(Place place) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<NetworkAssociation> cq = cb.createQuery(NetworkAssociation.class);
Root<NetworkAssociation> root = cq.from(NetworkAssociation.class);
cq.where(
cb.and(
cb.or(
cb.equal(root.get(NetworkAssociation_.status), NetworkAssociationStatus.PENDING),
cb.equal(root.get(NetworkAssociation_.status), NetworkAssociationStatus.ACTIVE)
),
cb.equal(root.get(NetworkAssociation_.place), place)
)
);
return getEm().createQuery(cq).getResultList();
}
public List<NetworkAssociation> findByIPAndMAC(LanEvent event, String ip, String mac) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<NetworkAssociation> cq = cb.createQuery(NetworkAssociation.class);
Root<NetworkAssociation> root = cq.from(NetworkAssociation.class);
cq.where(
cb.and(
cb.equal(root.get(NetworkAssociation_.event), event),
cb.equal(root.get(NetworkAssociation_.ip), ip),
cb.equal(root.get(NetworkAssociation_.mac), mac)
)
);
return getEm().createQuery(cq).getResultList();
}
public List<NetworkAssociation> findByStatus(LanEvent event, NetworkAssociationStatus status) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<NetworkAssociation> cq = cb.createQuery(NetworkAssociation.class);
Root<NetworkAssociation> root = cq.from(NetworkAssociation.class);
cq.where(
cb.and(
cb.equal(root.get(NetworkAssociation_.event), event),
cb.equal(root.get(NetworkAssociation_.status), status)
)
);
return getEm().createQuery(cq).getResultList();
}
}
......@@ -13,7 +13,6 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.enums.CardState;
......@@ -37,7 +36,6 @@ public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {
@EJB
private EventBeanLocal eventbean;
public PrintedCard findByCode(String code) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
......@@ -49,7 +47,7 @@ public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {
CardCode cardcode = getSingleNullableResult(getEm().createQuery(cq));
return (cardcode == null)?null : cardcode.getPrintedCard();
return (cardcode == null) ? null : cardcode.getPrintedCard();
}
public List<PrintedCard> findAllEnabled(LanEvent currentEvent) {
......@@ -71,6 +69,7 @@ public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {
cq.where(cb.equal(root.get(PrintedCard_.user), user),
cb.equal(root.get(PrintedCard_.event), eventbean.getCurrentEvent()));
cq.orderBy(cb.asc(root.get(PrintedCard_.template).get(CardTemplate_.power)));
return getEm().createQuery(cq).getResultList();
}
......@@ -113,7 +112,7 @@ public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {
List<PrintedCard> pcl = getEm().createQuery(cq).getResultList();
HashMap<Integer, PrintedCard> pch = new HashMap<>();
for(PrintedCard pc : pcl) {
for (PrintedCard pc : pcl) {
pch.put(pc.getUser().getId(), pc);
}
......
......@@ -38,11 +38,10 @@ public class EventUserCardStateFilter implements FacadeCallback<EventUser> {
logger.debug("Requiring states {}", states);
Path<Integer> rootId = root.get(EventUser_.id);
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<PrintedCard> subroot = subq.from(PrintedCard.class);
subq.select(subroot.join(PrintedCard_.user).get(EventUser_.id));
subq.where(subroot.get(PrintedCard_.cardState).in(states));
subq.where(subroot.get(PrintedCard_.cardState).in(states), cb.isTrue(subroot.get(PrintedCard_.enabled)));
predicates.add(rootId.in(subq));
}
......
package fi.codecrew.moya.beans;
import java.util.List;
import javax.ejb.Local;
import fi.codecrew.moya.model.NetworkAssociation;
@Local
public interface NetworkAssociationBeanLocal {
NetworkAssociation tryAssociate(String username, String password,
String ip, String mac, String code, boolean codeRequired)
throws Exception;
List<NetworkAssociation> getStatusByIPAndMAC(String ip, String mac);
List<NetworkAssociation> getActiveAssociations(boolean activatePending);
NetworkAssociation tryAssociate(String ip, String mac);
List<NetworkAssociation> getPendingAssociations();
void dropAssociationById(Integer associd);
}
......@@ -39,4 +39,6 @@ public interface VotingBeanLocal {
public void create(CompoEntryFile cef);
public List<CompoEntry> getEntriesForCurrentUser();
}
......@@ -57,5 +57,10 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1100-jdbc41</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -17,7 +17,12 @@
value="org.ancoron.postgresql.jpa.eclipselink.ConverterInitializer" />
<property name="eclipselink.descriptor.customizer"
value="fi.codecrew.moya.database.MoyaDescriptorCustomizer" />
<<<<<<< HEAD
<property name="eclipselink.create-ddl-jdbc-file-name" value="moya-database-schema.sql"/>
=======
<property name="eclipselink.create-ddl-jdbc-file-name" value="moyaCreateDDL.sql"/>
<property name="eclipselink.drop-ddl-jdbc-file-name" value="moyaDropDDL.sql"/>
>>>>>>> e37aec49afaa114abf3fded209914a5e71177053
</properties>
</persistence-unit>
......
......@@ -15,6 +15,7 @@ public class MoyaPostgreSQLPlatform extends PostgreSQLPlatform {
map.put(String.class, new FieldTypeDefinition("TEXT", false));
map.put(java.sql.Timestamp.class, new FieldTypeDefinition("TIMESTAMPTZ", false));
map.put(javax.json.JsonObject.class, new FieldTypeDefinition("JSON", false));
return map;
}
......
......@@ -4,22 +4,44 @@ import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import fi.codecrew.moya.utilities.jpa.ModelInterface;
@Entity
@Table(name = "db_models")
public class DBModel extends GenericEntity {
private static final long serialVersionUID = 5073284536090477220L;
public class DBModel implements ModelInterface {
private static final long serialVersionUID = 5073284536090477221L;
public static final String ID_COLUMN = "id";
@Column(name="revision", nullable=false)
@Id
@Column(name = ID_COLUMN, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "revision", nullable = false)
private Integer revision;
@Column(name="applied_at")
@Column(name = "applied_at")
@Temporal(TemporalType.TIMESTAMP)
private Date appliedAt = new Date();
@Override
public final Integer getId() {
return id;
}
@Override
public final void setId(Integer id) {
this.id = id;
}
public Date getAppliedAt() {
return appliedAt;
}
......
package fi.codecrew.moya.model;
import javax.json.JsonObject;
/**
* Entities that have a JSON meta data column implement this interface.
*
* Meta data can be just about anything that is not deemed to be essential
* enough to have it's own column. Including people's shirt sizes etc.
*
* @author jkj
*/
public interface EntityMeta {
/**
* Get JSON metadata associated with the entity.
*
* @return JsonObject from meta column in DB.
*/
public JsonObject getMeta();
/**
* Associate JSON metadata to entity.
*
* @param meta
* JsonObject that goes into meta column in DB.
*/
public void setMeta(JsonObject meta);
}
package fi.codecrew.moya.model;
import javax.json.JsonObject;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
......@@ -10,7 +11,7 @@ import fi.codecrew.moya.utilities.jpa.EntityEquals;
import fi.codecrew.moya.utilities.jpa.ModelInterface;
@MappedSuperclass
public class GenericEntity extends EntityEquals implements ModelInterface {
public class GenericEntity extends EntityEquals implements ModelInterface, EntityMeta {
private static final long serialVersionUID = -9041737052951021560L;
public static final String ID_COLUMN = "id";
......@@ -20,6 +21,8 @@ public class GenericEntity extends EntityEquals implements ModelInterface {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private JsonObject meta;
@Override
public final Integer getId() {
return id;
......@@ -30,4 +33,14 @@ public class GenericEntity extends EntityEquals implements ModelInterface {
this.id = id;
}
@Override
public JsonObject getMeta() {
return meta;
}
@Override
public void setMeta(JsonObject meta) {
this.meta = meta;
}
}
......@@ -22,7 +22,7 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
*
*/
@Entity
@Table(name = "licenseTargets")
@Table(name = "licensetargets")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class LicenseTarget extends GenericEntity {
......
package fi.codecrew.moya.model;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
import fi.codecrew.moya.enums.NetworkAssociationStatus;
@Entity
@Table(name = "network_associations")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class NetworkAssociation extends GenericEntity {
private static final long serialVersionUID = -7621152614442737756L;
@JoinColumn(name="event")
private LanEvent event;
@JoinColumn(name="event_user")
private EventUser eventUser;
@Column(name="ip")
private String ip;
@Column(name="mac")
private String mac;
@JoinColumn(name="place")
private Place place;
@Column(name = "create_time", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar createTime = Calendar.getInstance();
@Column(name = "modify_time", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar modifyTime = Calendar.getInstance();
@Column(name="status", nullable = false)
@Enumerated(EnumType.STRING)
private NetworkAssociationStatus status;
public LanEvent getEvent() {
return event;
}
public void setEvent(LanEvent event) {
this.event = event;
}
public EventUser getEventUser() {
return eventUser;
}
public void setEventUser(EventUser eventUser) {
this.eventUser = eventUser;
}
public String getIP() {
return ip;
}
public String getIp() {
return ip;
}
public void setIP(String ip) {
this.ip = ip;
}
public String getMAC() {
return mac;
}
public String getMac() {
return mac;
}
public void setMAC(String mac) {
this.mac = mac;
}
public Place getPlace() {
return place;
}
public void setPlace(Place place) {
this.place = place;
}
public Calendar getCreateTime() {
return createTime;
}
public void setCreateTime(Calendar createTime) {
this.createTime = createTime;
}
public Calendar getModifyTime() {
return modifyTime;
}
public void setModifyTime(Calendar modifyTime) {
this.modifyTime = modifyTime;
}
public NetworkAssociationStatus getStatus() {
return status;
}
public void setStatus(NetworkAssociationStatus status) {
this.status = status;
}
}
......@@ -184,22 +184,6 @@ public class ReaderEvent extends GenericEntity {
@Transient
public String getSeenSince() {
return "" + ((getUpdatetime().getTime() / 1000) / 60) +" min." ;
return "" + ((System.currentTimeMillis() - getUpdatetime().getTime()) / 1000 / 60) + " min.";
}
}
package fi.codecrew.moya.model.converters;
import java.io.StringReader;
import java.sql.SQLException;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import org.postgresql.util.PGobject;
@Converter(autoApply = true)
public class JsonAttributeConverter implements AttributeConverter<JsonObject, PGobject> {
public PGobject convertToDatabaseColumn(JsonObject attribute) {
if (attribute == null) {
return null;
}
final PGobject dataValue = new PGobject();
dataValue.setType("json");
try {
dataValue.setValue(attribute.toString());
} catch (SQLException e) {
// This will never run because PGobject.setValue() cannot really
// throw an SQLException. There is nothing but setting a property.
throw new RuntimeException("THIS SHOULD NEVER HAPPEN", e);
}
return dataValue;
}
public JsonObject convertToEntityAttribute(PGobject dbData) {
// Has any?
if (dbData == null) {
return null;
}
// Correct type of object?
if (dbData.getType().equals("json") == false) {
throw new RuntimeException("Expected JSON object from database");
}
// Read as JSON object
final StringReader stringReader = new StringReader(dbData.getValue());
final JsonReader jsonReader = Json.createReader(stringReader);
return jsonReader.readObject();
}
}
......@@ -26,6 +26,9 @@
<dependent-module archiveName="org.ancoron.postgresql.jpa-9.1.901.jdbc4.1-rc9.jar" deploy-path="/lib" handle="module:/classpath/var/M2_REPO/org/ancoron/postgresql/org.ancoron.postgresql.jpa/9.1.901.jdbc4.1-rc9/org.ancoron.postgresql.jpa-9.1.901.jdbc4.1-rc9.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="postgresql-9.3-1100-jdbc41.jar" deploy-path="/lib" handle="module:/classpath/var/M2_REPO/org/postgresql/postgresql/9.3-1100-jdbc41/postgresql-9.3-1100-jdbc41.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="pdfjet-0.0.0-2013-08-19.jar" deploy-path="/lib" handle="module:/classpath/var/M2_REPO/fi/iudex/pdfjet/pdfjet/0.0.0-2013-08-19/pdfjet-0.0.0-2013-08-19.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
......
......@@ -7,6 +7,7 @@ import fi.codecrew.moya.enums.apps.EventPermission;
import fi.codecrew.moya.enums.apps.LicensePermission;
import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.enums.apps.NetworkAssociationPermission;
import fi.codecrew.moya.enums.apps.PollPermission;
import fi.codecrew.moya.enums.apps.SalespointPermission;
import fi.codecrew.moya.enums.apps.ShopPermission;
......@@ -26,8 +27,8 @@ public enum BortalApplication {
COMPO(CompoPermission.class),
EVENT(EventPermission.class),
LICENSE(LicensePermission.class),
TOURNAMENT(TournamentPermission.class)
TOURNAMENT(TournamentPermission.class),
NETWORKASSOCIATION(NetworkAssociationPermission.class)
;
private final String key;
......
package fi.codecrew.moya.enums;
public enum NetworkAssociationStatus {
PENDING,
ACTIVE,
EXPIRED
}
package fi.codecrew.moya.enums.apps;
import fi.codecrew.moya.enums.BortalApplication;
public enum NetworkAssociationPermission implements IAppPermission {
OVERRIDE_PLACE_REQUIREMENT,
CAN_SHUFFLE_IN_GROUP,
CAN_ASSOCIATE,
CAN_ASSOCIATE_MANY_PER_PLACE,
CAN_ADMINISTER_ASSOCIATIONS,
;
public static final String S_OVERRIDE_PLACE_REQUIREMENT = "NETWORKASSOCIATION/OVERRIDE_PLACE_REQUIREMENT";
public static final String S_CAN_SHUFFLE_IN_GROUP = "NETWORKASSOCIATION/CAN_SHUFFLE_IN_GROUP";
public static final String S_CAN_ASSOCIATE = "NETWORKASSOCIATION/CAN_ASSOCIATE";
public static final String S_CAN_ASSOCIATE_MANY_PER_PLACE = "NETWORKASSOCIATION/CAN_ASSOCIATE_MANY_PER_PLACE";
public static final String S_CAN_ADMINISTER_ASSOCIATIONS = "NETWORKASSOCIATION/CAN_ADMINISTER_ASSOCIATIONS";
private final String fullName;
private final String key;
private static final String I18N_HEADER = "bortalApplication.networkauthentication.";
private NetworkAssociationPermission() {
key = I18N_HEADER + name();
fullName = new StringBuilder().append(getParent().toString()).append(DELIMITER).append(toString()).toString();
}
@Override
public BortalApplication getParent() {
return BortalApplication.NETWORKASSOCIATION;
}
@Override
public String getFullName() {
return fullName;
}
@Override
public String getI18nKey() {
return key;
}
}
......@@ -289,4 +289,9 @@ public abstract class GenericFacade<C extends ModelInterface> {
public void evict(C entity) {
getEm().getEntityManagerFactory().getCache().evict(getEntityClass(), entity.getId());
}
public boolean isAttached(ModelInterface entity) {
return getEm().contains(entity);
}
}
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:products="http://java.sun.com/jsf/composite/cditools/products"
xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"
>
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{networkAssociationView.initView}" />
</f:metadata>
<ui:define name="content">
<h:form>
<p:messages autoUpdate="true" redisplay="false"></p:messages>
<h1>#{i18n['networkassociation.current_associations']}</h1>
<p:dataTable var="activeAssoc" value="#{networkAssociationView.activeAssociations}">
<p:column headerText="#{i18n['networkassociation.create_time']}">
<h:outputText value="#{activeAssoc.createTime.time}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['networkassociation.modify_time']}">
<h:outputText value="#{activeAssoc.modifyTime.time}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['networkassociation.user']}">
<h:link outcome="/useradmin/edit" value="#{activeAssoc.eventUser.user.nick}">
<f:param name="userid" value="#{activeAssoc.eventUser.user.id}" />
</h:link>
</p:column>
<p:column headerText="#{i18n['networkassociation.ip_address']}">
<h:outputText value="#{activeAssoc.ip}" />
</p:column>
<p:column headerText="#{i18n['networkassociation.mac_address']}">
<h:outputText value="#{activeAssoc.mac}" />
</p:column>
<p:column headerText="#{i18n['networkassociation.place']}">
<h:outputText value="#{activeAssoc.place.name}" />
</p:column>
<p:column headerText="#{i18n['networkassociation.action']}">
<p:commandButton value="#{i18n['networkassociation.drop_association']}" action="#{networkAssociationView.dropAssociation(activeAssoc.id)}" update="@form" immediate="true"/>
</p:column>
</p:dataTable>
<h1>#{i18n['networkassociation.pending_associations']}</h1>
<p:dataTable var="activeAssoc" value="#{networkAssociationView.pendingAssociations}">
<p:column headerText="#{i18n['networkassociation.create_time']}">
<h:outputText value="#{activeAssoc.createTime.time}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['networkassociation.modify_time']}">
<h:outputText value="#{activeAssoc.modifyTime.time}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['networkassociation.user']}">
<h:link outcome="/useradmin/edit" value="#{activeAssoc.eventUser.user.nick}">
<f:param name="userid" value="#{activeAssoc.eventUser.user.id}" />
</h:link>
</p:column>
<p:column headerText="#{i18n['networkassociation.ip_address']}">
<h:outputText value="#{activeAssoc.ip}" />
</p:column>
<p:column headerText="#{i18n['networkassociation.mac_address']}">
<h:outputText value="#{activeAssoc.mac}" />
</p:column>
<p:column headerText="#{i18n['networkassociation.place']}">
<h:outputText value="#{activeAssoc.place.name}" />
</p:column>
<p:column headerText="#{i18n['networkassociation.action']}">
<p:commandButton value="#{i18n['networkassociation.drop_association']}" action="#{networkAssociationView.dropAssociation(activeAssoc.id)}" update="@form" immediate="true"/>
</p:column>
</p:dataTable>
<br />
<h:panelGrid columns="3">
<h:outputText value="#{i18n['networkassociation.ip_address']}" />
<h:outputText value="#{i18n['networkassociation.mac_address']}" />
<h:outputText value="" />
<p:inputText style="width: 90%;" validator="#{networkAssociationView.validateIP}" value="#{networkAssociationView.ipAddress}"/>
<p:inputText style="width: 90%;" validator="#{networkAssociationView.validateMAC}" value="#{networkAssociationView.macAddress}"/>
<p:commandButton value="#{i18n['networkassociation.create_association']}" action="#{networkAssociationView.createAssociation}" update="@form"/>
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -33,13 +33,13 @@
</h:panelGroup>
<h:panelGroup>
<h:panelGroup >
<reader:codefield selectaction="#{productShopView.readCode}" selectvalue="#{i18n['shop.readBarcode']}" />
<br />
<p:dataTable id="prods" value="#{productShopView.boughtItems}" var="prods">
<p:dataTable id="prods" value="#{productShopView.boughtItems}" var="prods" style="width:500px;">
<p:column headerText="#{i18n['shop.count']}">
<p:inputText value="#{prods.count}" size="2">
<f:ajax render="@form" listener="#{productShopView.countBoughtChangeListener}" />
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:products="http://java.sun.com/jsf/composite/cditools/products" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:viewParam name="reader" value="#{rfidListenerView.reader}" />
<f:viewParam name="tag" value="#{rfidListenerView.tag}" />
<f:event type="preRenderView" listener="#{rfidListenerView.cardRead()}" />
</f:metadata>
<ui:define name="title">
<h1>#{i18n['page.product.createBill.header']}</h1>
</ui:define>
<ui:define name="content">
Hi.
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -19,7 +19,7 @@
<h:messages errorClass="error" />
<h:panelGroup rendered="#{tournamentCreateView.tournamentGames.isEmpty() eq false}">
<h2>#{i18n['tournaments.admin.select_a_game']}</h2>
<h:selectOneMenu value="#{userGameIDView.gameToAddIdTo}" converter="#{tournamentGameConverter}">
<h:selectOneMenu value="#{tournamentCreateView.game}" converter="#{tournamentGameConverter}">
<f:selectItems var="game" itemLabel="#{game.name}" value="#{tournamentCreateView.tournamentGames}" itemValue="#{game}" />
</h:selectOneMenu>
</h:panelGroup>
......
......@@ -7,14 +7,14 @@
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{userView.initView}" />
<f:event type="preRenderView" listener="#{voteListView.initView}" />
</f:metadata>
<ui:define name="content">
<h1>My entries</h1>
<h:form>
<h:dataTable styleClass="bordertable" rowClasses="roweven,rowodd" id="compolisttable" value="#{userView.user.compoEntries}" var="entry">
<h:dataTable styleClass="bordertable" rowClasses="roweven,rowodd" id="compolisttable" value="#{voteListView.entries}" var="entry">
<h:column>
<f:facet name="header">
<h:outputText value="Title" />
......
......@@ -81,7 +81,7 @@
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.0.RC2</version>
<version>5.0</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -140,11 +140,11 @@ public class HostnameFilter implements Filter {
StringBuilder hashBuilder = new StringBuilder();
hashBuilder.append("rest:");
hashBuilder.append(httpRequest.getPathInfo()).append(":");
hashBuilder.append(httpRequest.getParameter("appkey")).append(":");
hashBuilder.append(httpRequest.getParameter("appuser")).append(":");
hashBuilder.append(httpRequest.getParameter("appstamp")).append(":");
hashBuilder.append(httpRequest.getParameter("appmac"));
hashBuilder.append(httpRequest.getParameter("appmac")).append(":");
hashBuilder.append(httpRequest.getPathInfo());
boolean ret = true;
try {
......
......@@ -567,6 +567,18 @@ menuitem.navigation.key = Product flag
nasty.user = Go away!
networkassociation.action = Action
networkassociation.create_association = Create association
networkassociation.create_time = Created on
networkassociation.current_associations = Current Associations
networkassociation.drop_association = Drop
networkassociation.ip_address = IP Address
networkassociation.mac_address = MAC Address
networkassociation.modify_time = Modified on
networkassociation.pending_associations = Pending Associations
networkassociation.place = Place
networkassociation.user = User
news.abstract = Abstract
news.edit = Edit
news.expire = Expire
......@@ -974,6 +986,7 @@ submenu.license.manageCodes = Manage codes
submenu.license.viewCodes = View codes
submenu.map.create = Create map
submenu.map.list = List maps
submenu.networkassociation.index = Associations
submenu.orgrole.create = Create organisationrole
submenu.orgrole.list = Organisation roles
submenu.pages.create = Create content
......@@ -1051,6 +1064,7 @@ topmenu.admin = Admin View
topmenu.helpdesk = Helpdesk
topmenu.user = User View
topnavi.adminassoc = Net Associations
topnavi.adminshop = Adminshop
topnavi.billing = Billing
topnavi.competitions = Competitions
......
......@@ -577,6 +577,18 @@ menu.user.edit = Omat tiedot
nasty.user = Mene pois!
networkassociation.action = Toiminto
networkassociation.create_association = Luo assosiaatio
networkassociation.create_time = Luontiaika
networkassociation.current_associations = Aktiiviset assosiaatiot
networkassociation.drop_association = Poista
networkassociation.ip_address = IP-osoite
networkassociation.mac_address = MAC-osoite
networkassociation.modify_time = Muutosaika
networkassociation.pending_associations = Odottavat assosiaatiot
networkassociation.place = Paikka
networkassociation.user = K\u00E4ytt\u00E4j\u00E4
news.abstract = Lyhennelm\u00E4
news.edit = Muokkaa
news.expire = Lopeta julkaisu
......@@ -955,6 +967,7 @@ submenu.license.manageCodes = Hallinnoi lisenssej\u00E4
submenu.license.viewCodes = N\u00E4yt\u00E4 koodit
submenu.map.create = Uusi kartta
submenu.map.list = N\u00E4yt\u00E4 kartat
submenu.networkassociation.index = Assosiaatiot
submenu.orgrole.create = Luo j\u00E4rjest\u00E4j\u00E4rooli
submenu.orgrole.list = J\u00E4rjest\u00E4j\u00E4roolit
submenu.pages.create = Luo sis\u00E4lt\u00F6\u00E4
......@@ -1035,6 +1048,7 @@ topmenu.admin = Yll\u00E4piton\u00E4kym\u00E4
topmenu.helpdesk = Helpdesk
topmenu.user = K\u00E4ytt\u00E4j\u00E4n\u00E4kym\u00E4
topnavi.adminassoc = Verkkoassosioinnit
topnavi.adminshop = Kauppa
topnavi.billing = Laskutus
topnavi.competitions = Kilpailut
......
package fi.codecrew.moya.rest;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import fi.codecrew.moya.beans.NetworkAssociationBeanLocal;
import fi.codecrew.moya.enums.NetworkAssociationStatus;
import fi.codecrew.moya.model.NetworkAssociation;
import fi.codecrew.moya.rest.pojo.NetworkAssociationActionPojo;
import fi.codecrew.moya.rest.pojo.NetworkAssociationResponseRoot;
@RequestScoped
@Path("/networkassociation")
public class NetworkAssociationRestView {
@EJB
private NetworkAssociationBeanLocal networkAssociationBean;
@POST
@Path("/auth")
@Produces({ MediaType.APPLICATION_JSON })
public NetworkAssociationResponseRoot auth(
@FormParam("username") String username,
@FormParam("password") String password,
@FormParam("ip") String ip,
@FormParam("mac") String mac,
@FormParam("code") String code,
@FormParam("coderequired") Boolean codeRequired
) {
NetworkAssociationResponseRoot resp = new NetworkAssociationResponseRoot();
try {
NetworkAssociation na = networkAssociationBean.tryAssociate(
username, password, ip, mac, code, codeRequired);
if(na.getStatus().equals(NetworkAssociationStatus.ACTIVE))
resp.getAdditions().add(new NetworkAssociationActionPojo(na.getIP(), na.getMAC()));
else
resp.getPendings().add(new NetworkAssociationActionPojo(na.getIP(), na.getMAC()));
} catch(Exception e) {
resp.getResult().setResultCode(0);
if(e.getMessage() != null && e.getMessage() != "") {
resp.getResult().setMessage(e.getMessage());
} else {
resp.getResult().setMessage("UNKNOWN_ERROR");
}
}
return resp;
}
@GET
@Path("/get_all/{activate}")
@Produces({ MediaType.APPLICATION_JSON })
public NetworkAssociationResponseRoot getAll(
@PathParam("activate") Boolean activate
) {
NetworkAssociationResponseRoot resp = new NetworkAssociationResponseRoot();
try {
if(activate == null)
throw new Exception("INVALID_PARAMETER_FOR_ACTIVATE");
List<NetworkAssociation> activeAssociations = networkAssociationBean.getActiveAssociations(activate);
for(NetworkAssociation na : activeAssociations) {
resp.getAdditions().add(new NetworkAssociationActionPojo(na.getIP(), na.getMAC()));
}
return resp;
} catch(Exception e) {
resp.getResult().setResultCode(0);
resp.getResult().setMessage(e.getMessage());
return resp;
}
}
@POST
@Path("/get_status_by_ip_mac")
@Produces({ MediaType.APPLICATION_JSON })
public NetworkAssociationResponseRoot getChanges(
@FormParam("ip") String ip,
@FormParam("mac") String mac
) {
NetworkAssociationResponseRoot resp = new NetworkAssociationResponseRoot();
try {
for(NetworkAssociation na : networkAssociationBean.getStatusByIPAndMAC(ip, mac)) {
if(na.getStatus().equals(NetworkAssociationStatus.ACTIVE)) {
resp.getAdditions().add(new NetworkAssociationActionPojo(na.getIP(), na.getMAC()));
} else if(na.getStatus().equals(NetworkAssociationStatus.PENDING)) {
resp.getPendings().add(new NetworkAssociationActionPojo(na.getIP(), na.getMAC()));
} else if(na.getStatus().equals(NetworkAssociationStatus.EXPIRED)) {
resp.getRemovals().add(new NetworkAssociationActionPojo(na.getIP(), na.getMAC()));
}
}
return resp;
} catch(Exception e) {
resp.getResult().setResultCode(0);
resp.getResult().setMessage(e.getMessage());
return resp;
}
}
}
package fi.codecrew.moya.rest.pojo;
import javax.xml.bind.annotation.XmlElement;
public class NetworkAssociationActionPojo {
private String ip;
private String mac;
public NetworkAssociationActionPojo() {
this.ip = "";
this.mac = "";
}
public NetworkAssociationActionPojo(String ip, String mac) {
this.ip = ip;
this.mac = mac;
}
@XmlElement(name = "ip")
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
@XmlElement(name = "mac")
public String getMac() {
return mac;
}
public void setMac(String mac) {
this.mac = mac;
}
}
\ No newline at end of file
package fi.codecrew.moya.rest.pojo;
import java.util.ArrayList;
import java.util.List;
public class NetworkAssociationResponseRoot {
private RESTCallResultPojo result;
private List<NetworkAssociationActionPojo> additions;
private List<NetworkAssociationActionPojo> removals;
private List<NetworkAssociationActionPojo> pendings;
public NetworkAssociationResponseRoot() {
this.result = new RESTCallResultPojo();
this.setAdditions(new ArrayList<NetworkAssociationActionPojo>());
this.setRemovals(new ArrayList<NetworkAssociationActionPojo>());
this.setPendings(new ArrayList<NetworkAssociationActionPojo>());
}
public RESTCallResultPojo getResult() {
return result;
}
public void setResult(RESTCallResultPojo result) {
this.result = result;
}
public List<NetworkAssociationActionPojo> getAdditions() {
return additions;
}
public void setAdditions(List<NetworkAssociationActionPojo> additions) {
this.additions = additions;
}
public List<NetworkAssociationActionPojo> getRemovals() {
return removals;
}
public void setRemovals(List<NetworkAssociationActionPojo> removals) {
this.removals = removals;
}
public List<NetworkAssociationActionPojo> getPendings() {
return pendings;
}
public void setPendings(List<NetworkAssociationActionPojo> pendings) {
this.pendings = pendings;
}
}
\ No newline at end of file
package fi.codecrew.moya.rest.pojo;
import javax.xml.bind.annotation.XmlElement;
public class RESTCallResultPojo {
private Integer resultCode;
private String resultMessage;
@XmlElement(name = "code")
public Integer getResultCode() {
return resultCode;
}
public void setResultCode(Integer resultCode) {
this.resultCode = resultCode;
}
@XmlElement(name = "message")
public String getMessage() {
return this.resultMessage;
}
public void setMessage(String message) {
this.resultMessage = message;
}
public RESTCallResultPojo(Integer code, String result) {
this.resultCode = code;
this.resultMessage = result;
}
public RESTCallResultPojo() {
this.resultCode = 1;
this.resultMessage = "ok";
}
}
\ No newline at end of file
......@@ -9,7 +9,6 @@ import java.util.zip.CRC32;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
......@@ -29,8 +28,8 @@ public class ErrorPageView implements Serializable {
// private static final long serialVersionUID = -2179309061036632342L;
String trace;
@Inject
private transient FacesContext context;
// @Inject
// private transient FacesContext context;
@SuppressWarnings("unused")
private static final Logger logger = LoggerFactory.getLogger(ErrorPageView.class);
......@@ -70,16 +69,11 @@ public class ErrorPageView implements Serializable {
}
public String getTrail() {
HttpServletRequest req = (HttpServletRequest) getContext().getExternalContext().getRequest();
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest();
Object trail = req.getSession().getAttribute(HostnameFilter.HTTP_TRAIL_NAME);
return trail != null ? trail.toString() : "";
}
public FacesContext getContext() {
return context;
}
public void setContext(FacesContext context) {
this.context = context;
}
}
\ No newline at end of file
......@@ -9,7 +9,6 @@ import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.inject.Inject;
import javax.inject.Named;
......@@ -41,9 +40,6 @@ public class MenuView {
@Inject
private transient SessionStore sessionstore;
@Inject
private transient FacesContext context;
@EJB
private transient MenuBeanLocal menubean;
......@@ -63,8 +59,8 @@ public class MenuView {
public List<PageContent> getPagecontent(String pagekey)
{
String key = new StringBuilder(layoutview.getPagepath()).append(":").append(pagekey).toString();
// Removed by tkfftk, enought is enought
// logger.debug("Getting pagecontent for key {}. Matches: {}", key, contents.containsKey(key));
// Removed by tkfftk, enought is enought
// logger.debug("Getting pagecontent for key {}. Matches: {}", key, contents.containsKey(key));
if (!contents.containsKey(key)) {
contents.put(key, pagebean.findContentsForUser(key, sessionstore.getLocale()));
......@@ -234,10 +230,6 @@ public class MenuView {
return ret;
}
public void setContext(FacesContext context) {
this.context = context;
}
public LayoutView getLayoutview() {
return layoutview;
}
......
package fi.codecrew.moya.web.cdiview.networkassociation;
import java.net.InetAddress;
import java.util.List;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;
import javax.mail.internet.InternetAddress;
import fi.codecrew.moya.beans.NetworkAssociationBeanLocal;
import fi.codecrew.moya.enums.apps.NetworkAssociationPermission;
import fi.codecrew.moya.enums.apps.TournamentPermission;
import fi.codecrew.moya.model.NetworkAssociation;
import fi.codecrew.moya.utilities.jsf.MessageHelper;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named
@RequestScoped
public class NetworkAssociationView extends GenericCDIView {
private String ipAddress;
private String macAddress;
@EJB
private NetworkAssociationBeanLocal networkAssociationBean;
public void initView() {
super.requirePermissions(NetworkAssociationPermission.CAN_ADMINISTER_ASSOCIATIONS);
}
public String createAssociation() {
this.networkAssociationBean.tryAssociate(this.ipAddress, this.macAddress.toLowerCase());
this.ipAddress = "";
this.macAddress = "";
return "";
}
public String dropAssociation(String aid) {
Integer associd = Integer.parseInt(aid);
this.networkAssociationBean.dropAssociationById(associd);
return "";
}
public void validateIP(FacesContext context, UIComponent ui, Object object) throws Exception {
String addr = object.toString().trim();
if(addr.length() == 0)
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "networkassociation.invalid_ip_address", ""));
try {
InetAddress.getByName(addr);
} catch(Exception e) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "networkassociation.invalid_ip_address", ""));
}
}
public void validateMAC(FacesContext context, UIComponent ui, Object object) {
String addr = object.toString().trim();
Pattern p = Pattern.compile("(?:[0-9a-fA-F]{1,2}:){5}[0-9a-fA-F]{1,2}");
if(!p.matcher(addr).find()) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "networkassociation.invalid_mac_address", ""));
}
}
public List<NetworkAssociation> getActiveAssociations() {
return networkAssociationBean.getActiveAssociations(false);
}
public List<NetworkAssociation> getPendingAssociations() {
return networkAssociationBean.getPendingAssociations();
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public String getMacAddress() {
return macAddress;
}
public void setMacAddress(String macAddress) {
this.macAddress = macAddress;
}
}
package fi.codecrew.moya.web.cdiview.reader;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Named;
import fi.codecrew.moya.beans.ReaderBeanLocal;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named
@ConversationScoped
public class RfidListenerView extends GenericCDIView {
@EJB
private ReaderBeanLocal readerbean;
private String reader;
private String tag;
public void cardRead()
{
readerbean.checkCode(reader, tag);
}
public String getReader() {
return reader;
}
public void setReader(String reader) {
this.reader = reader;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
......@@ -104,7 +104,6 @@ public class TournamentCreateView extends GenericCDIView {
}
tournamentRules = tournamentBean.getRulesByGame(game);
System.out.println(tournamentRules);
break;
case "selectRuleset":
if (rulesetName != null && rulesetName.length() > 0) {
......
package fi.codecrew.moya.web.cdiview.voting;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import fi.codecrew.moya.beans.VotingBeanLocal;
import fi.codecrew.moya.enums.apps.CompoPermission;
import fi.codecrew.moya.model.CompoEntry;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named
@RequestScoped
public class VoteListView extends GenericCDIView {
private static final long serialVersionUID = 4166316634472472472L;
@EJB
private VotingBeanLocal votebean;
private List<CompoEntry> entries;
public void initView()
{
if (super.requirePermissions(CompoPermission.SUBMIT_ENTRY))
setEntries(votebean.getEntriesForCurrentUser());
}
public List<CompoEntry> getEntries() {
return entries;
}
public void setEntries(List<CompoEntry> entries) {
this.entries = entries;
}
}
......@@ -38,8 +38,6 @@ public class LayoutView implements Serializable {
*
*/
private static final long serialVersionUID = 4468645109141859301L;
@Inject
private FacesContext context;
private ResourceBundle rb;
private String pagename;
@EJB
......@@ -106,6 +104,7 @@ public class LayoutView implements Serializable {
}
public String getPagepath() {
FacesContext context = FacesContext.getCurrentInstance();
if (pagename == null &&
context != null &&
context.getExternalContext() != null &&
......@@ -140,6 +139,8 @@ public class LayoutView implements Serializable {
}
private ResourceBundle getResourcebundle() {
FacesContext context = FacesContext.getCurrentInstance();
if (rb == null) {
rb = context.getApplication().getResourceBundle(context, "i18n");
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!