Commit 5db922ed by Tuomas Riihimäki

Moved PlaceMap Servlet implementation to beans.

2 parents 6fd7ba35 dec183d9
Showing with 409 additions and 246 deletions
package fi.insomnia.bortal.beans;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import fi.insomnia.bortal.facade.EventFacade;
import fi.insomnia.bortal.model.Event;
/**
* Session Bean implementation class EventBean
*/
@Stateless
public class EventBean implements EventBeanLocal {
@EJB
private EventFacade eventFacade;
@Override
public Event getEventByHostname(String hostname) {
Event ret = eventFacade.findByHostname(hostname);
if (ret == null) {
ret = findOrCreateDefaultEvent();
}
return ret;
}
public Event findOrCreateDefaultEvent() {
Event ret = eventFacade.findByHostname("");
if (ret == null) {
ret = new Event();
ret.setReferer("");
ret.setName("DEFAULT EVENT");
eventFacade.create(ret);
}
return ret;
}
}
package fi.insomnia.bortal.beans;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;
import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.Event;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User;
/**
* Session Bean implementation class PlaceMapBean
*/
@Stateless
public class PlaceMapBean implements PlaceMapBeanLocal {
/**
* Default constructor.
*/
public PlaceMapBean() {
// TODO Auto-generated constructor stub
}
@EJB
private PlaceFacade placeFacade;
@EJB
private EventMapFacade eventMapFacade;
@EJB
private UserFacade userFacade;
@Override
public void printPlaceMapToStream(OutputStream outputStream, String filetype, Event event, Integer mapId, Integer userId, Integer placeId) throws IOException {
Integer eventId = event.getId();
Place place = null;
EventMap map = null;
if (placeId != null) {
EventPk pk = new EventPk();
pk.setEventId(eventId);
pk.setId(placeId);
place = placeFacade.find(eventId, placeId);
}
if (place != null) {
map = place.getMap();
} else {
EventPk pk = new EventPk();
pk.setEventId(eventId);
pk.setId(mapId);
map = eventMapFacade.find(pk);
}
BufferedImage image = map.getMapWithPlaces();
if (userId != null) {
User user = userFacade.find(userId);
if (user != null) {
for (PlaceGroup uplacegroup : user.getPlaceGroupList()) {
for (Place uplace : uplacegroup.getPlaces())
uplace.drawOwnedPlace(image);
}
}
}
if (place != null) {
place.drawSelectedPlace(image);
}
ImageIO.write(image, filetype, outputStream);
}
}
......@@ -22,9 +22,9 @@ public class SecurityBean implements SecurityBeanLocal {
private final Logger logger = org.slf4j.LoggerFactory.getLogger(SecurityBean.class);
@EJB
LogEntryTypeFacade typeFacade;
private LogEntryTypeFacade typeFacade;
@EJB
LogEntryFacade entryFacade;
private LogEntryFacade entryFacade;
/**
* Default constructor.
......
package fi.insomnia.bortal.beans;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import fi.insomnia.bortal.facade.EventFacade;
import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.facade.EventSettingsFacade;
import fi.insomnia.bortal.facade.EventStatusFacade;
import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.Event;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventSettings;
import fi.insomnia.bortal.model.EventStatus;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.User;
/**
* Session Bean implementation class TestDataBean
*/
@Stateless
public class TestDataBean implements TestDataBeanLocal {
public static final String TEST_MAP_IMAGE_NAME = "testmap.png";
@EJB
private EventMapFacade eventMapFacade;
@EJB
private EventStatusFacade eventStatusFacade;
@EJB
private EventSettingsFacade eventSettingsFacade;
@EJB
private EventFacade eventFacade;
@EJB
private UserFacade userFacade;
@EJB
private PlaceFacade placeFacade;
/**
* Default constructor.
*/
public TestDataBean() {
// TODO Auto-generated constructor stub
}
public EventMap generateTestMap(Event event) {
try {
EventMap map = new EventMap();
map.setEvent(event);
InputStream stream = getClass().getResourceAsStream(TEST_MAP_IMAGE_NAME);
File file = new File(getClass().getResource(TEST_MAP_IMAGE_NAME).toURI());
long length = file.length();
// Create the byte array to hold the data
byte[] bytes = new byte[(int) length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead = stream.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + file.getName());
}
stream.close();
map.setMapData(bytes);
eventMapFacade.create(map);
return map;
} catch (URISyntaxException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
return null;
}
/**
* Generate all metashit, ex. events.
*/
public Event generateMetaData() {
EventStatus status = new EventStatus();
status.setStatusName("BLAAH");
eventStatusFacade.create(status);
EventSettings settings = new EventSettings();
settings.setOrganisation("MUN ORGANISAATIO; EI SUN!");
settings.setAdmin(generateUser());
eventSettingsFacade.create(settings);
Event event = new Event();
event.setName("testEvent");
event.setSettings(settings);
event.setStatus(status);
eventFacade.create(event);
return event;
}
private User generateUser() {
User user = new User();
user.setNick("Nick");
user.setPassword("plaah");
userFacade.create(user);
return user;
}
public void generateTestPlaces(EventMap map) {
for (int x = 5; x < 400; x += 50) {
for (int y = 5; y < 150; y += 50) {
Place place = new Place();
place.setMap(map);
place.setMapX(x);
place.setMapY(y);
placeFacade.create(place);
}
}
}
}
......@@ -6,13 +6,21 @@ import fi.insomnia.bortal.model.EventPk;
/**
* Session Bean implementation class GenericFacade
*/
public abstract class EventChildGenericFacade<T extends EventChildInterface> extends GenericFacade<EventPk,T> implements EventChildGenericFacadeLocal<T>{
public abstract class EventChildGenericFacade<T extends EventChildInterface> extends GenericFacade<EventPk,T> {
public EventChildGenericFacade(Class<T> entityClass) {
super(entityClass);
}
public T find(Integer eventId, Integer id)
{
EventPk pk = new EventPk();
pk.setEventId(eventId);
pk.setId(id);
return find(pk);
}
}
......@@ -4,6 +4,8 @@ import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import fi.insomnia.bortal.model.Event;
@Stateless
......@@ -21,4 +23,13 @@ public class EventFacade extends GenericFacade<Integer, Event> {
return em;
}
public Event findByHostname(String hostname) {
TypedQuery<Event> q = em.createNamedQuery("Event.findByReferer", Event.class);
q.setParameter("referer", hostname);
return this.getSingleNullableResult(q);
}
}
......@@ -13,7 +13,7 @@ import fi.insomnia.bortal.model.ModelInterface;
/**
* Session Bean implementation class GenericFacade
*/
public abstract class GenericFacade<PK,T extends ModelInterface<PK>> implements GenericFacadeLocal<PK,T> {
public abstract class GenericFacade<PK,T extends ModelInterface<PK>>{
private Class<T> entClass;
public GenericFacade(Class<T>entityClass)
......@@ -27,16 +27,16 @@ public abstract class GenericFacade<PK,T extends ModelInterface<PK>> implements
protected abstract EntityManager getEm();
@Override
public void create(T entity) {
getEm().persist(entity);
}
@Override
public void remove(T entity) {
getEm().remove(entity);
}
@Override
public T merge(T entity) {
return getEm().merge(entity);
}
......
......@@ -10,7 +10,7 @@ import fi.insomnia.bortal.model.User;
@Stateless
@LocalBean
public class UserFacade extends GenericFacade<Integer, User> implements UserFacadeLocal{
public class UserFacade extends GenericFacade<Integer, User>{
public static final String DEFAULT_USER_LOGIN = "ANONYMOUS";
......
package fi.insomnia.bortal.beans;
import javax.ejb.Local;
import fi.insomnia.bortal.model.Event;
@Local
public interface EventBeanLocal {
Event getEventByHostname(String hostname);
}
package fi.insomnia.bortal.beans;
import java.io.IOException;
import java.io.OutputStream;
import javax.ejb.Local;
import fi.insomnia.bortal.model.Event;
@Local
public interface PlaceMapBeanLocal {
void printPlaceMapToStream(OutputStream outputStream, String filetype, Event event, Integer mapId, Integer userId, Integer placeId) throws IOException;
}
package fi.insomnia.bortal.beans;
import javax.ejb.Local;
import fi.insomnia.bortal.model.Event;
import fi.insomnia.bortal.model.EventMap;
@Local
public interface TestDataBeanLocal {
EventMap generateTestMap(Event event);
Event generateMetaData();
void generateTestPlaces(EventMap map);
}
package fi.insomnia.bortal.facade;
import fi.insomnia.bortal.model.EventChildInterface;
import fi.insomnia.bortal.model.EventPk;
public interface EventChildGenericFacadeLocal<T extends EventChildInterface> extends GenericFacadeLocal<EventPk,T>{
}
package fi.insomnia.bortal.facade;
import fi.insomnia.bortal.model.Event;
public interface EventFacadeLocal extends GenericFacadeLocal<Integer, Event> {
}
package fi.insomnia.bortal.facade;
import fi.insomnia.bortal.model.EventMap;
public interface EventMapFacadeLocal extends EventChildGenericFacadeLocal<EventMap> {
}
package fi.insomnia.bortal.facade;
import java.util.List;
import javax.ejb.Local;
import fi.insomnia.bortal.model.ModelInterface;
@Local
public interface GenericFacadeLocal<PK, T extends ModelInterface<PK>> {
void create(T entity);
void remove(T entity);
T merge(T entity);
T find(PK id);
List<T> findAll();
List<T> findRange(int[] range);
long count();
}
package fi.insomnia.bortal.facade;
import fi.insomnia.bortal.model.Place;
public interface PlaceFacadeLocal extends EventChildGenericFacadeLocal<Place> {
}
package fi.insomnia.bortal.facade;
import fi.insomnia.bortal.model.User;
public interface UserFacadeLocal extends GenericFacadeLocal<Integer,User> {
}
......@@ -24,26 +24,22 @@ import javax.persistence.Version;
*
*/
@Entity
@Table(name = "event_status", uniqueConstraints = { @UniqueConstraint(columnNames = { "status_name" }) })
@NamedQueries( {
@Table(name = "event_status", uniqueConstraints = {
@UniqueConstraint(columnNames = {"status_name"})})
@NamedQueries({
@NamedQuery(name = "EventStatus.findAll", query = "SELECT e FROM EventStatus e"),
@NamedQuery(name = "EventStatus.findByStatusName", query = "SELECT e FROM EventStatus e WHERE e.statusName = :statusName") })
@NamedQuery(name = "EventStatus.findByStatusName", query = "SELECT e FROM EventStatus e WHERE e.statusName = :statusName")})
public class EventStatus implements ModelInterface<Integer> {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "event_status_id", nullable = false)
private Integer id;
@Column(name = "status_name", nullable = false)
private String statusName;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "status")
private List<Event> events;
@Version
@Column(nullable = false)
private int jpaVersionField = 0;
......
......@@ -83,4 +83,5 @@ public class HostnameFilter implements Filter {
return ret;
}
}
......@@ -4,24 +4,20 @@
*/
package fi.insomnia.bortal.servlet;
import fi.insomnia.bortal.facade.EventMapFacadeLocal;
import fi.insomnia.bortal.facade.PlaceFacadeLocal;
import fi.insomnia.bortal.facade.UserFacadeLocal;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.User;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import fi.insomnia.bortal.HostnameFilter;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.PlaceMapBeanLocal;
import fi.insomnia.bortal.model.Event;
/**
*
* @author tuukka
......@@ -32,98 +28,67 @@ public class PlaceMap extends HttpServlet {
*
*/
private static final long serialVersionUID = 8769688627918936258L;
@EJB
private PlaceMapBeanLocal placemapBean;
private EventBeanLocal eventBean;
public static final String PARAMETER_EVENT_MAP_ID = "mapid";
public static final String PARAMETER_SELECTED_PLACE_ID = "placeid";
public static final String PARAMETER_CURRENT_USER_ID = "userid";
public static final String PARAMETER_EVENT_ID = "eventid";
@EJB
private PlaceFacadeLocal placeFacade;
@EJB
private EventMapFacadeLocal eventMapFacade;
@EJB
private UserFacadeLocal userFacade;
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Integer eventId = getIntegerParameter(request, PARAMETER_EVENT_ID);
try {
Integer placeId = getIntegerParameter(request, PARAMETER_SELECTED_PLACE_ID);
Integer mapId = getIntegerParameter(request, PARAMETER_EVENT_MAP_ID);
Integer userId = getIntegerParameter(request, PARAMETER_CURRENT_USER_ID);
Place place = null;
EventMap map = null;
if (placeId != null) {
EventPk pk = new EventPk();
pk.setEventId(eventId);
pk.setId(placeId);
place = placeFacade.find(pk);
}
if (place != null) {
map = place.getMap();
} else {
EventPk pk = new EventPk();
pk.setEventId(eventId);
pk.setId(mapId);
map =eventMapFacade.find(pk);
}
BufferedImage image = map.getMapWithPlaces();
if (userId != null) {
User user = userFacade.find(userId);
if(user != null) {
place.drawOwnedPlace(image);
}
}
if (place != null) {
place.drawSelectedPlace(image);
}
response.setContentType("image/png");
placemapBean.printPlaceMapToStream(response.getOutputStream(), "png", getEvent(request), mapId, userId, placeId);
response.setContentType("image/png");
ImageIO.write(image, "png", response.getOutputStream());
/* TODO output your page here
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet PlaceMap</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet PlaceMap at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
/*
* TODO output your page here out.println("<html>");
* out.println("<head>");
* out.println("<title>Servlet PlaceMap</title>");
* out.println("</head>"); out.println("<body>");
* out.println("<h1>Servlet PlaceMap at " + request.getContextPath
* () + "</h1>"); out.println("</body>"); out.println("</html>");
*/
} finally {
out.close();
}
}
private Event getEvent(HttpServletRequest request) {
String hostname = HostnameFilter.getHostname(request.getSession());
return eventBean.getEventByHostname(hostname);
}
public void addPlacesToMap() {
}
/***
* Convert request parameter into integer
*
* @param request
* @param parameter
* @return
......@@ -138,13 +103,19 @@ public class PlaceMap extends HttpServlet {
return null;
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
// <editor-fold defaultstate="collapsed"
// desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
......@@ -154,10 +125,15 @@ public class PlaceMap extends HttpServlet {
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*
* @param request
* servlet request
* @param response
* servlet response
* @throws ServletException
* if a servlet-specific error occurs
* @throws IOException
* if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
......@@ -167,6 +143,7 @@ public class PlaceMap extends HttpServlet {
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
......
......@@ -4,23 +4,13 @@
*/
package fi.insomnia.bortal.view;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import fi.insomnia.bortal.facade.EventFacadeLocal;
import fi.insomnia.bortal.facade.EventMapFacadeLocal;
import fi.insomnia.bortal.facade.PlaceFacadeLocal;
import fi.insomnia.bortal.beans.TestDataBeanLocal;
import fi.insomnia.bortal.model.Event;
import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.Place;
/**
*
......@@ -30,92 +20,22 @@ import fi.insomnia.bortal.model.Place;
@RequestScoped
public class TestDataView {
public static final String TEST_MAP_IMAGE_NAME = "testmap.png";
@EJB
private EventMapFacadeLocal eventMapFacade;
@EJB
private EventFacadeLocal eventFacade;
private TestDataBeanLocal testdatabean;
private PlaceFacadeLocal placeFacade;
public void generateData() {
Event event = generateMetaData();
EventMap map = generateTestMap(event);
generateTestPlaces(map);
}
private EventMap generateTestMap(Event event) {
try {
EventMap map = new EventMap();
map.setEvent(event);
InputStream stream = getClass().getResourceAsStream(TEST_MAP_IMAGE_NAME);
File file = new File(getClass().getResource(TEST_MAP_IMAGE_NAME).toURI());
long length = file.length();
// Create the byte array to hold the data
byte[] bytes = new byte[(int) length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead = stream.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + file.getName());
}
stream.close();
Event event = testdatabean.generateMetaData();
EventMap map = testdatabean.generateTestMap(event);
testdatabean.generateTestPlaces(map);
map.setMapData(bytes);
eventMapFacade.create(map);
return map;
} catch (URISyntaxException ex) {
Logger.getLogger(TestDataView.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(TestDataView.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
/**
* Generate all metashit, ex. events.
*/
private Event generateMetaData() {
Event event = new Event();
event.setName("testEvent");
eventFacade.create(event);
return event;
}
private void generateTestPlaces(EventMap map) {
for (int x = 5; x < 400; x += 50) {
for (int y = 5; y < 150; y += 50) {
Place place = new Place();
place.setMap(map);
place.setMapX(x);
place.setMapY(y);
placeFacade.create(place);
}
}
}
/** Creates a new instance of TestDataView */
public TestDataView() {
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!