LicenseBean.java 4.92 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moya.beans;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.facade.LicenseCodeFacade;
import fi.codecrew.moya.facade.LicenseTargetFacade;
import fi.codecrew.moya.facade.UserFacade;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LicenseCode;
import fi.codecrew.moya.model.LicenseTarget;
import fi.codecrew.moya.model.User;

/**
 * Session Bean implementation class GameBean
 */
@Stateless
public class LicenseBean implements LicenseBeanLocal {

	@EJB
	LicenseCodeFacade licenseCodeFacade;

	@EJB
	UserFacade userFacade;

	@EJB
	LicenseTargetFacade licenseTargetFacade;

	@EJB
	EventBeanLocal eventBean;

	@EJB
	PlaceBeanLocal placeBean;

	private static final Logger logger = LoggerFactory.getLogger(LicenseBean.class);

	/**
	 * Check, and if needed generate code for gamecode.
	 * 
	 * @param code
	 */
	private LicenseCode generateCode(LicenseCode code) throws GenerationException {

		if (code.getCode() == null || code.getCode().trim().equals("")) {
			if (code.getLicenseTarget().getCodeUrl() == null || code.getLicenseTarget().getCodeUrl().trim().equals("")) {
				throw new GenerationException("Code generate failed");
			}

			try {
				URL url = new URL(code.getLicenseTarget().getCodeUrl());

				URLConnection uc;

				uc = url.openConnection();

				BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
				String codeString = "";
				String tmpLine;

				while ((tmpLine = in.readLine()) != null) {
					if (!codeString.equals("")) {
						codeString += "\n";
					}
					codeString += tmpLine;
				}

				if (codeString.trim().equals("0") || codeString.trim().equals("")) {
					throw new GenerationException("Code generate failed");
				}

				code.setCode(codeString);

				code = licenseCodeFacade.merge(code);

				return code;

			} catch (IOException e) {
				logger.warn("Code generate failed", e);
				throw new GenerationException("Code generate failed");
			}
		}
		throw new RuntimeException("LOL, what?");
	}

	public LicenseCode accessCode(LicenseCode code) throws GenerationException {

		code = generateCode(code);

		if (!code.isAccessed()) {
			code.setAccessed(Calendar.getInstance());

			code = licenseCodeFacade.merge(code);
		}

		return code;
	}

	public List<LicenseTarget> findAll(LanEvent event) {
		return event.getGames();
	}

	public void saveOrCreateLicense(LicenseTarget target) {
		if (target.getId() == null) {
			target.setEvent(eventBean.getCurrentEvent());
			eventBean.getCurrentEvent().getGames().add(target);
			licenseTargetFacade.create(target);
			//target = licenseTargetFacade.merge(target);
		}
		else {
			target = licenseTargetFacade.merge(target);
		}
	}

	/**
	 * Default constructor.
	 */
	public LicenseBean() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public List<LicenseTarget> findUserGames(EventUser user) {

		ArrayList<LicenseTarget> returnLicenses = new ArrayList<LicenseTarget>();

		if (user.getGroupMemberships() != null) {
			for (GroupMembership memberShip : user.getGroupMemberships()) {

				if (memberShip.getPlaceReservation() == null)
					continue;

				for (LicenseTarget license : memberShip.getPlaceReservation().getProduct().getLicenseTargets()) {
					if (license.isActive()) {
						returnLicenses.add(license);
					}
				}
			}
		}

		return returnLicenses;
	}

	@Override
	public List<LicenseTarget> findUnopenedUserGames(EventUser user) {

		List<LicenseTarget> returnLicenses = findUserGames(user);

		for (LicenseCode code : user.getUser().getLicenseCodes()) {
			returnLicenses.remove(code.getLicenseTarget());
		}

		return returnLicenses;
	}

	@Override
	public LicenseCode createAndAccessCode(LicenseTarget target, User user) throws GenerationException {
		user = userFacade.reload(user);
		LicenseCode code = new LicenseCode(target);
		user.getLicenseCodes().add(code);
		code.setUser(user);
		licenseCodeFacade.create(code);

		code = accessCode(code);

		return code;
	}

}