Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Codecrew
/
Moya
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
30
Merge Requests
2
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 12e50381
authored
Feb 04, 2017
by
Tuomas Riihimäki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add timelapse possibility to legacy placemap image generator
1 parent
3747c7f2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
315 additions
and
300 deletions
code/moya-web/pom.xml
code/moya-web/src/main/java/fi/codecrew/moya/servlet/PlaceMapServlet.java
code/moya-web/pom.xml
View file @
12e5038
...
...
@@ -35,8 +35,11 @@
<artifactId>
primefaces-extensions
</artifactId>
<version>
${primefaces.extensions}
</version>
</dependency>
<dependency>
<groupId>
joda-time
</groupId>
<artifactId>
joda-time
</artifactId>
<version>
2.3
</version>
</dependency>
<dependency>
<groupId>
org.primefaces.themes
</groupId>
<artifactId>
all-themes
</artifactId>
...
...
code/moya-web/src/main/java/fi/codecrew/moya/servlet/PlaceMapServlet.java
View file @
12e5038
...
...
@@ -43,6 +43,8 @@ import javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
fi.codecrew.moya.enums.apps.UserPermission
;
import
org.joda.time.format.ISODateTimeFormat
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -58,307 +60,317 @@ import fi.codecrew.moya.model.Place;
import
fi.codecrew.moya.utilities.moyamessage.MoyaEventType
;
/**
*
* @author tuukka
*/
@WebServlet
(
"/PlaceMap"
)
public
class
PlaceMapServlet
extends
HttpServlet
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
PlaceMapServlet
.
class
);
private
static
final
long
serialVersionUID
=
8769688627918936258L
;
@EJB
private
transient
PlaceBeanLocal
placeBean
;
@EJB
private
transient
PermissionBeanLocal
permbean
;
@EJB
private
transient
LoggingBeanLocal
loggerbean
;
@EJB
private
UserBeanLocal
userBean
;
@EJB
private
BarcodeBeanLocal
barcodeBean
;
private
static
final
String
PARAMETER_EVENT_MAP_ID
=
"mapid"
;
private
static
final
String
PARAMETER_USER_ID
=
"userid"
;
private
static
final
String
PARAMETER_TOKEN
=
"token"
;
/**
* 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
{
logger
.
debug
(
"Begin processing request"
);
// response.setContentType("text/html;charset=UTF-8");
// PrintWriter out = response.getWriter();
ServletOutputStream
ostream
=
null
;
try
{
// Integer placeId = getIntegerParameter(request,
// PARAMETER_SELECTED_PLACE_ID);
Integer
mapId
=
getIntegerParameter
(
request
,
PARAMETER_EVENT_MAP_ID
);
Integer
userId
=
getIntegerParameter
(
request
,
PARAMETER_USER_ID
);
String
userToken
=
request
.
getParameter
(
PARAMETER_TOKEN
);
EventMap
map
=
placeBean
.
findMap
(
mapId
);
logger
.
debug
(
"Mapid: {}"
,
mapId
);
ostream
=
response
.
getOutputStream
();
if
(
map
==
null
||
map
.
getMapData
()
==
null
)
{
logger
.
warn
(
"Error handling map {}!"
,
map
);
response
.
setStatus
(
HttpServletResponse
.
SC_NOT_FOUND
);
ostream
.
print
(
"Map error!"
);
}
else
{
String
[]
splittype
=
map
.
getMimeType
().
split
(
"/"
);
String
type
=
"png"
;
if
(
splittype
.
length
>
0
)
type
=
splittype
[
splittype
.
length
-
1
];
response
.
setContentType
(
map
.
getMimeType
());
printPlaceMapToStream
(
ostream
,
type
,
map
,
userId
,
userToken
);
logger
.
debug
(
"Flushing ostream"
);
ostream
.
flush
();
}
}
catch
(
EJBException
e
)
{
logger
.
debug
(
"Permission denied. Returning SC_FORBIDDEN!"
);
response
.
setContentType
(
"text/html;charset=UTF-8"
);
response
.
setStatus
(
HttpServletResponse
.
SC_FORBIDDEN
);
ostream
=
response
.
getOutputStream
();
ostream
.
print
(
"Error 403 \nPermission denied! Please login before accessing resource"
);
// e.printStackTrace();
}
finally
{
if
(
ostream
!=
null
)
{
ostream
.
close
();
}
}
}
private
void
printPlaceMapToStream
(
OutputStream
outputStream
,
String
filetype
,
EventMap
map
,
Integer
userid
,
String
userToken
)
throws
IOException
{
EventUser
user
=
null
;
if
(
userToken
!=
null
)
user
=
barcodeBean
.
getUserFromLongTextCode
(
userToken
);
if
(!
permbean
.
hasPermission
(
MapPermission
.
VIEW
)
&&
user
==
null
)
{
loggerbean
.
sendMessage
(
MoyaEventType
.
USER_INSUFFICIENT_PERMISSIONS
,
permbean
.
getCurrentUser
(),
"User tried to print the placemap to stream without sufficient permissions"
);
throw
new
EJBAccessException
(
"Not enough permissions to print placemap"
);
}
long
begin
=
new
Date
().
getTime
();
// List<Place> selectedPlaceList = placeBean.findPlaces(placeIds);
// logger.debug("SelectedPlaceList: size {}, {} ",
// selectedPlaceList.size(), selectedPlaceList);
// map = eventMapFacade.find(eventId, mapId);
// if (map == null) {
// throw new PermissionDeniedException(secubean, user,
// "Map not found with id: " + mapId + " and event id: " +
// eventbean.getCurrentEvent());
// }
// logger.debug("Got map object {}", map);
List
<
Place
>
places
=
map
.
getPlaces
();
List
<
Place
>
userplaces
=
null
;
if
(
userid
!=
null
&&
userid
!=
0
)
{
EventUser
placesForUser
=
userBean
.
findByUserId
(
userid
,
false
);
if
(
user
!=
null
)
{
userplaces
=
placeBean
.
findPlacePrintlistForUser
(
placesForUser
);
}
}
if
(
user
!=
null
)
{
userplaces
=
placeBean
.
findPlacePrintlistForUser
(
user
);
}
if
(
user
==
null
)
user
=
permbean
.
getCurrentUser
();
// List<Place> selectedPlaces = placemapBean.findSelectedPlaces(map);
BufferedImage
image
=
ImageIO
.
read
(
new
ByteArrayInputStream
(
map
.
getMapData
()));
Graphics2D
g2d
=
image
.
createGraphics
();
for
(
Place
place
:
places
)
{
if
(
userplaces
!=
null
)
{
if
(
userplaces
.
contains
(
place
))
{
drawPlace
(
place
,
g2d
,
user
,
true
,
true
);
}
else
{
drawPlace
(
place
,
g2d
,
user
,
true
,
false
);
}
}
else
{
drawPlace
(
place
,
g2d
,
user
,
false
,
false
);
}
}
// BufferedImage image = map.getMapWithPlaces(, selectedPlaces);
logger
.
debug
(
"Prewrite {}"
,
new
Date
().
getTime
()
-
begin
);
ImageIO
.
write
(
image
,
filetype
,
outputStream
);
logger
.
debug
(
"postwrite {}"
,
new
Date
().
getTime
()
-
begin
);
}
/***
* Convert request parameter into integer
*
* @param request
* @param parameter
* @return
*/
private
static
Integer
getIntegerParameter
(
HttpServletRequest
request
,
String
parameter
)
{
try
{
String
valueString
=
request
.
getParameter
(
parameter
);
Integer
value
=
Integer
.
parseInt
(
valueString
);
return
value
;
}
catch
(
NumberFormatException
nfe
)
{
}
return
null
;
}
// <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
*/
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
processRequest
(
request
,
response
);
}
/**
* 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
*/
@Override
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
processRequest
(
request
,
response
);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public
String
getServletInfo
()
{
return
"Short description"
;
}
// </editor-fold>
private
static
final
Color
RESERVED_COLOR
=
Color
.
RED
;
private
static
final
Color
SELECTED_COLOR
=
Color
.
BLUE
;
private
static
final
Color
OWNED_COLOR
=
Color
.
GREEN
;
private
static
final
Color
BORDER_COLOR
=
Color
.
BLACK
;
private
static
final
Color
LOCKED_COLOR
=
Color
.
DARK_GRAY
;
private
static
void
drawPlace
(
Place
p
,
Graphics2D
g
,
EventUser
user
,
boolean
onlyFrame
,
boolean
hilight
)
{
if
(
p
.
isDisabled
())
{
return
;
}
Color
color
=
null
;
if
(!
onlyFrame
)
{
if
(!
p
.
isBuyable
())
{
logger
.
debug
(
"Setting color as locked place."
);
color
=
LOCKED_COLOR
;
}
if
(
p
.
isReservedFor
(
user
))
{
// logger.debug("Setting place selected {}", p);
color
=
SELECTED_COLOR
;
}
else
if
(
user
.
equals
(
p
.
getCurrentUser
())
||
(
p
.
getGroup
()
!=
null
&&
user
.
equals
(
p
.
getGroup
().
getCreator
()))
||
(
p
.
getPlaceReserver
()
!=
null
&&
user
.
equals
(
p
.
getPlaceReserver
().
getUser
())))
{
color
=
OWNED_COLOR
;
// logger.debug("Setting place owned {}", p);
}
else
if
(
p
.
isTaken
())
{
color
=
RESERVED_COLOR
;
// logger.debug("Setting place Reserved {}", p);
}
else
if
(
p
.
getProduct
()
!=
null
&&
p
.
getProduct
()
!=
null
&&
p
.
getProduct
().
getColor
()
!=
null
&&
!
p
.
getProduct
().
getColor
().
isEmpty
())
{
try
{
color
=
Color
.
decode
(
p
.
getProduct
().
getColor
());
}
catch
(
NumberFormatException
x
)
{
logger
.
error
(
"Cannot convert string {} to color."
,
p
.
getProduct
().
getColor
());
}
}
else
{
// too much debugging -TKjne
// logger.debug("Nothing special for this place. Color should be default.");
}
}
if
(
hilight
)
{
color
=
OWNED_COLOR
;
}
if
(
color
!=
null
)
{
//logger.debug("Setting fill color: {} for p", color, p);
g
.
setColor
(
color
);
g
.
fill
(
new
Rectangle
(
p
.
getMapX
()+
1
,
p
.
getMapY
()+
1
,
p
.
getWidth
()-
1
,
p
.
getHeight
()-
1
));
}
g
.
setColor
(
BORDER_COLOR
);
g
.
draw
(
new
Rectangle
(
p
.
getMapX
(),
p
.
getMapY
(),
p
.
getWidth
(),
p
.
getHeight
()));
}
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
PlaceMapServlet
.
class
);
private
static
final
long
serialVersionUID
=
8769688627918936258L
;
@EJB
private
transient
PlaceBeanLocal
placeBean
;
@EJB
private
transient
PermissionBeanLocal
permbean
;
@EJB
private
transient
LoggingBeanLocal
loggerbean
;
@EJB
private
UserBeanLocal
userBean
;
@EJB
private
BarcodeBeanLocal
barcodeBean
;
private
static
final
String
PARAMETER_EVENT_MAP_ID
=
"mapid"
;
private
static
final
String
PARAMETER_USER_ID
=
"userid"
;
private
static
final
String
PARAMETER_TOKEN
=
"token"
;
private
static
final
String
PARAMETER_DATE
=
"date"
;
/**
* 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
{
logger
.
debug
(
"Begin processing request"
);
// response.setContentType("text/html;charset=UTF-8");
// PrintWriter out = response.getWriter();
ServletOutputStream
ostream
=
null
;
try
{
// Integer placeId = getIntegerParameter(request,
// PARAMETER_SELECTED_PLACE_ID);
Integer
mapId
=
getIntegerParameter
(
request
,
PARAMETER_EVENT_MAP_ID
);
String
timelapseDate
=
request
.
getParameter
(
PARAMETER_DATE
);
EventMap
map
=
placeBean
.
findMap
(
mapId
);
logger
.
debug
(
"Mapid: {}"
,
mapId
);
ostream
=
response
.
getOutputStream
();
if
(
map
==
null
||
map
.
getMapData
()
==
null
)
{
logger
.
warn
(
"Error handling map {}!"
,
map
);
response
.
setStatus
(
HttpServletResponse
.
SC_NOT_FOUND
);
ostream
.
print
(
"Map error!"
);
return
;
}
String
[]
splittype
=
map
.
getMimeType
().
split
(
"/"
);
String
type
=
"png"
;
if
(
splittype
.
length
>
0
)
{
type
=
splittype
[
splittype
.
length
-
1
];
}
response
.
setContentType
(
map
.
getMimeType
());
if
(
timelapseDate
==
null
||
timelapseDate
.
trim
().
isEmpty
())
{
Integer
userId
=
getIntegerParameter
(
request
,
PARAMETER_USER_ID
);
String
userToken
=
request
.
getParameter
(
PARAMETER_TOKEN
);
EventUser
user
=
null
;
if
(
userToken
!=
null
)
{
user
=
barcodeBean
.
getUserFromLongTextCode
(
userToken
);
}
if
(!
permbean
.
hasPermission
(
MapPermission
.
VIEW
)
&&
user
==
null
)
{
loggerbean
.
sendMessage
(
MoyaEventType
.
USER_INSUFFICIENT_PERMISSIONS
,
permbean
.
getCurrentUser
(),
"User tried to print the placemap to stream without sufficient permissions"
);
throw
new
EJBAccessException
(
"Not enough permissions to print placemap"
);
}
// Find for user only with sufficient permissions
if
(
user
!=
null
&&
userId
!=
0
&&
permbean
.
hasPermission
(
UserPermission
.
VIEW_ALL
))
{
user
=
userBean
.
findByUserId
(
userId
,
false
);
}
printPlaceMapToStream
(
ostream
,
type
,
map
,
user
);
}
else
{
Date
date
=
ISODateTimeFormat
.
dateTime
().
parseDateTime
(
timelapseDate
).
toDate
();
printTimelapseToStream
(
ostream
,
type
,
map
,
date
);
}
ostream
.
flush
();
}
catch
(
EJBException
e
)
{
logger
.
debug
(
"Permission denied. Returning SC_FORBIDDEN!"
);
response
.
setContentType
(
"text/html;charset=UTF-8"
);
response
.
setStatus
(
HttpServletResponse
.
SC_FORBIDDEN
);
ostream
=
response
.
getOutputStream
();
ostream
.
print
(
"Error 403 \nPermission denied! Please login before accessing resource"
);
// e.printStackTrace();
}
finally
{
if
(
ostream
!=
null
)
{
ostream
.
close
();
}
}
}
private
void
printTimelapseToStream
(
OutputStream
ostr
,
String
filetype
,
EventMap
map
,
Date
date
)
throws
IOException
{
BufferedImage
image
=
drawMap
(
map
,
new
TimelapsePicker
(
date
));
ImageIO
.
write
(
image
,
filetype
,
ostr
);
}
private
void
printPlaceMapToStream
(
OutputStream
outputStream
,
String
filetype
,
EventMap
map
,
EventUser
user
)
throws
IOException
{
List
<
Place
>
userplaces
=
null
;
if
(
user
!=
null
)
{
userplaces
=
placeBean
.
findPlacePrintlistForUser
(
user
);
}
// Yes this is is in correct order.
if
(
user
==
null
)
{
user
=
permbean
.
getCurrentUser
();
}
BufferedImage
image
=
drawMap
(
map
,
new
LegacyColorPicker
(
user
,
userplaces
));
ImageIO
.
write
(
image
,
filetype
,
outputStream
);
}
private
BufferedImage
drawMap
(
EventMap
map
,
PlaceColorPicker
colorPicker
)
throws
IOException
{
BufferedImage
image
=
ImageIO
.
read
(
new
ByteArrayInputStream
(
map
.
getMapData
()));
Graphics2D
g2d
=
image
.
createGraphics
();
for
(
Place
place
:
map
.
getPlaces
())
{
drawPlace
(
place
,
g2d
,
colorPicker
);
}
return
image
;
}
/***
* Convert request parameter into integer
*
* @param request
* @param parameter
* @return
*/
private
static
Integer
getIntegerParameter
(
HttpServletRequest
request
,
String
parameter
)
{
try
{
String
valueString
=
request
.
getParameter
(
parameter
);
Integer
value
=
Integer
.
parseInt
(
valueString
);
return
value
;
}
catch
(
NumberFormatException
nfe
)
{
}
return
null
;
}
// <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
*/
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
processRequest
(
request
,
response
);
}
/**
* 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
*/
@Override
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
processRequest
(
request
,
response
);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public
String
getServletInfo
()
{
return
"Short description"
;
}
// </editor-fold>
private
static
final
Color
RESERVED_COLOR
=
Color
.
RED
;
private
static
final
Color
SELECTED_COLOR
=
Color
.
BLUE
;
private
static
final
Color
OWNED_COLOR
=
Color
.
GREEN
;
private
static
final
Color
BORDER_COLOR
=
Color
.
BLACK
;
private
static
final
Color
LOCKED_COLOR
=
Color
.
DARK_GRAY
;
private
static
interface
PlaceColorPicker
{
Color
getColor
(
Place
p
);
}
public
static
class
TimelapsePicker
implements
PlaceColorPicker
{
private
final
Date
date
;
public
TimelapsePicker
(
Date
date
)
{
this
.
date
=
date
;
}
@Override
public
Color
getColor
(
Place
p
)
{
if
(
p
.
getReserverSlot
()
!=
null
&&
date
.
after
(
p
.
getReserverSlot
().
getUsed
()))
{
return
RESERVED_COLOR
;
}
return
null
;
}
}
public
static
class
LegacyColorPicker
implements
PlaceColorPicker
{
private
final
EventUser
user
;
// private final boolean onlyFrame;
// private final boolean hilight;
private
final
List
<
Place
>
userplaces
;
// public LegacyColorPicker(EventUser u, boolean onlyFrame, boolean
// hilight) {
// this.user = u;
// this.onlyFrame = onlyFrame;
// this.hilight = hilight;
// }
public
LegacyColorPicker
(
EventUser
user2
,
List
<
Place
>
userplaces
)
{
this
.
user
=
user2
;
this
.
userplaces
=
userplaces
;
}
public
Color
getColor
(
Place
p
)
{
Color
color
=
null
;
// Check if we wan
if
(
userplaces
==
null
)
{
if
(!
p
.
isBuyable
())
{
logger
.
debug
(
"Setting color as locked place."
);
color
=
LOCKED_COLOR
;
}
if
(
p
.
isReservedFor
(
user
))
{
// logger.debug("Setting place selected {}", p);
color
=
SELECTED_COLOR
;
}
else
if
(
user
.
equals
(
p
.
getCurrentUser
())
||
(
p
.
getGroup
()
!=
null
&&
user
.
equals
(
p
.
getGroup
().
getCreator
()))
||
(
p
.
getPlaceReserver
()
!=
null
&&
user
.
equals
(
p
.
getPlaceReserver
().
getUser
())))
{
color
=
OWNED_COLOR
;
// logger.debug("Setting place owned {}", p);
}
else
if
(
p
.
isTaken
())
{
color
=
RESERVED_COLOR
;
// logger.debug("Setting place Reserved {}", p);
}
else
if
(
p
.
getProduct
()
!=
null
&&
p
.
getProduct
()
!=
null
&&
p
.
getProduct
().
getColor
()
!=
null
&&
!
p
.
getProduct
().
getColor
().
isEmpty
())
{
try
{
color
=
Color
.
decode
(
p
.
getProduct
().
getColor
());
}
catch
(
NumberFormatException
x
)
{
logger
.
error
(
"Cannot convert string {} to color."
,
p
.
getProduct
().
getColor
());
}
}
else
{
// too much debugging -TKjne
// logger.debug("Nothing special for this place. Color
// should be default.");
}
}
else
if
(
userplaces
.
contains
(
p
))
{
color
=
OWNED_COLOR
;
}
return
color
;
}
}
;
private
static
void
drawPlace
(
Place
p
,
Graphics2D
g
,
PlaceColorPicker
colorPicker
)
{
if
(
p
.
isDisabled
())
{
return
;
}
Color
color
=
colorPicker
.
getColor
(
p
);
if
(
color
!=
null
)
{
// logger.debug("Setting fill color: {} for p", color, p);
g
.
setColor
(
color
);
g
.
fill
(
new
Rectangle
(
p
.
getMapX
()
+
1
,
p
.
getMapY
()
+
1
,
p
.
getWidth
()
-
1
,
p
.
getHeight
()
-
1
));
}
g
.
setColor
(
BORDER_COLOR
);
g
.
draw
(
new
Rectangle
(
p
.
getMapX
(),
p
.
getMapY
(),
p
.
getWidth
(),
p
.
getHeight
()));
}
}
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment