/*
* Copyright 2004-2010 Information & Software Engineering Group (188/1)
* Institute of Software Technology and Interactive Systems
* Vienna University of Technology, Austria
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package at.tuwien.ifs.somtoolbox.apps.server;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import cern.colt.Arrays;
import at.tuwien.ifs.somtoolbox.layers.LayerAccessException;
import at.tuwien.ifs.somtoolbox.visualization.BackgroundImageVisualizer;
import at.tuwien.ifs.somtoolbox.visualization.BackgroundImageVisualizerInstance;
import at.tuwien.ifs.somtoolbox.visualization.Visualizations;
/**
* @author Rudolf Mayer
* @version $Id: MapServlet.java 3589 2010-05-21 10:42:01Z mayer $
*/
public class MapServlet extends HttpServlet {
protected static SOMMap map;
protected static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (map == null) {
map = SOMMap.getInstance();
}
System.out.println("\n\n Map Servlet: "
+ at.tuwien.ifs.somtoolbox.util.StringUtils.printMap(request.getParameterMap()));
response.setBufferSize(128 * 1024);
ServletOutputStream out = response.getOutputStream();
response.setContentType("text/html");
out.println("<link rel=\"StyleSheet\" href=\"style.css\" type=\"text/css\" media=\"all\"/>");
SOMPageParameters params = new SOMPageParameters(request);
params.setShowLabelsDefault(true);
params.parseRequest(request);
if (params.fodokIds != null) {
String[] ids = params.fodokIds.split(",");
System.out.println("processing ids:" + Arrays.toString(ids));
}
String basicMoveLink = params.basicLink + "&zoom=" + params.zoom;
String basicMoveXLink = basicMoveLink + "&moveY=" + params.move.height;
String basicMoveYLink = basicMoveLink + "&moveX=" + params.move.width;
String basicZoomLink = params.basicLink + "&moveX=" + params.move.width + "moveY=" + params.move.height
+ "&zoom=";
try {
HTMLMapInformation mapData = map.createFullMap(request, params.vis, params.palette, params.smoothingFactor,
params.mapWidth, params.mapHeight, params.zoom, params.moveX, params.moveY, params.pointSelection,
params.showGrid, params.showNodes, params.showLabels, params.fodokIds, params.fullLink,
params.areaSelection);
out.println("<table border=\"0\">");
// table layout:
// | zoom & selection tools & vis selecter
// | | move up | |
// | move left | map | move right |
// | | move down | |
// first table row: zoom & selection tools
out.println("<tr>");
out.println("<td colspan=\"3\" align=\"center\" valign=\"top\">");
// zoom out button
if (params.zoom > 1) {
out.println("<a title=\"zoom out\" href=\""
+ basicZoomLink
+ (params.zoom - 1)
+ "\"><img align=\"top\" border=\"0\" src=\"images/map/zoomOut.gif\" onmouseover=\"this.src='images/map/zoomOutSelected.gif';\" onmouseout=\"this.src='images/map/zoomOut.gif';\" ></a>");
} else {
out.println("<img align=\"top\" border=\"0\" src=\"images/map/zoomOutNA.gif\">");
}
// direct links to change zoom levels & zoom status
for (int i = 1; i <= 3; i++) {
if (params.zoom == i) {
out.println("<div valign=\"top\" class=\"mapScaleOn\" style=\"margin: 1px 0pt 3px;\" title=\"Current zoom level: "
+ i + "\">" + i + "</div>");
} else {
out.println("<a valign=\"top\" class=\"mapScaleOff\" href=\"" + basicZoomLink + i
+ "\" title=\"Switch to zoom level " + i + "\" style=\"margin: 1px 0pt 3px;\">" + i
+ "</a>");
}
}
// zoom in button
if (params.zoom < 3) {
out.println("<a title=\"zoom in\" href=\""
+ basicZoomLink
+ (params.zoom + 1)
+ "\"><img align=\"top\" border=\"0\" src=\"images/map/zoomIn.gif\" onmouseover=\"this.src='images/map/zoomInSelected.gif';\" onmouseout=\"this.src='images/map/zoomIn.gif';\" ></a>");
} else {
out.println("<img align=\"top\" border=\"0\" src=\"images/map/zoomInNA.gif\">");
}
// area selection toggle
out.println("<a href=\"javascript:toggleAreaSelection('yes');\">");
out.println(" <img align=\"top\" alt=\"Select area of units\" border=\"0\" height=\"22\" src=\"images/map/areaSelection.gif\" title=\"Select area of units\" width=\"43\">");
out.println("</a>");
// select between default vis and class
BackgroundImageVisualizerInstance currentVis = Visualizations.getVisualizationByName(StringUtils.isNotBlank(request.getParameter("visualisation"))
? request.getParameter("visualisation") : params.visDefault);
// String visControl = map.getVisualisationSelect(params.visDefault, request.getParameter("visualisation"));
String visControl = ServerVisualizations.getVisualisationsControl(ServerSOM.availableVis, currentVis);
out.println("<form style=\"display:inline;\">");
// pass on parameters
printHiddenFormInput(request, out, "fodokId");
printHiddenFormInput(request, out, "fodokIds");
printHiddenFormInput(request, out, "zoom");
printHiddenFormInput(request, out, "moveX");
printHiddenFormInput(request, out, "moveY");
printHiddenFormInput(request, out, "x");
printHiddenFormInput(request, out, "y");
out.println(visControl);
// String vis = request.getParameter("visualisation");
// if (vis == null) {
// vis = params.visDefault;
// }
// out.println(ServerVisualizations.getVisualisationsControl(vis));
out.println("<noscript><input style=\"font-size: x-small;\" type=\"submit\" value=\"Update!\"></noscript>");
out.println("</form>");
out.println("</td>");
if (params.vis.equals("Thematic Class Map")) {
out.println("<td rowspan=\"4\" bordercolor=\"black\" style=\"border: thin\">");
out.println("<b>Class legend</b>");
out.println(map.getClassLegend());
out.println("</td>");
}
out.println("</tr>");
// second row
out.println("<tr>");
out.println("<td></td>");
// navigate up
out.println("<td align=\"center\">");
if (params.allowMoveUp) {
out.println("<a href=\"" + basicMoveYLink + "&moveY=" + (params.move.height - 1)
+ "\" alt=\"^^\" title=\"Navigate up\">");
out.println("<img border=\"0\" alt=\"^^\" src=\"images/map/navigateUp.png\" onmouseover=\"this.src='images/map/navigateUpSelected.png';\" onmouseout=\"this.src='images/map/navigateUp.png';\">");
out.println("</a>");
} else {
out.println("<img border=\"0\" alt=\"^^\" src=\"images/map/navigateUpNA.png\" title=\"Already at upper map edge\">");
}
out.println("</td>");
out.println("<td></td>");
out.println("</tr>");
// third row
out.println("<tr>");
// navigate left
out.println("<td>");
if (params.allowMoveLeft) {
out.println("<a href=\"" + basicMoveXLink + "&moveX=" + (params.move.width - 1)
+ "\" alt=\"<<\" title=\"Navigate up\">");
out.println("<img border=\"0\" alt=\"vv\" src=\"images/map/navigateLeft.png\" onmouseover=\"this.src='images/map/navigateLeftSelected.png';\" onmouseout=\"this.src='images/map/navigateLeft.png';\">");
out.println("</a>");
} else {
out.println("<img border=\"0\" alt=\"<<\" src=\"images/map/navigateLeftNA.png\" title=\"Already at left map edge\">");
}
out.println("</td>");
// map
out.println("<td align=\"center\"><img border=\"0\" src=\"" + mapData.getImagePath()
+ "\" usemap=\"#som-map\" alt=\"\"/></td>");
// navigate right
out.println("<td>");
if (params.allowMoveRight) {
out.println("<a href=\"" + basicMoveXLink + "&moveX=" + (params.move.width + 1)
+ "\" alt=\">>\" title=\"Navigate right\">");
out.println("<img border=\"0\" alt=\">>\" src=\"images/map/navigateRight.png\" onmouseover=\"this.src='images/map/navigateRightSelected.png';\" onmouseout=\"this.src='images/map/navigateRight.png';\">");
out.println("</a>");
} else {
out.println("<img border=\"0\" alt=\">>\" src=\"images/map/navigateRightNA.png\" title=\"Already at right map edge\">");
}
out.println("</td>");
out.println("</tr>");
// 4th row
out.println("<tr>");
out.println("<td></td>");
// navigate down
out.println("<td align=\"center\">");
if (params.allowMoveDown) {
out.println("<a href=\"" + basicMoveYLink + "&moveY=" + (params.move.height + 1)
+ "\" alt=\"vv\" title=\"Navigate down\">");
out.println("<img border=\"0\" alt=\"vv\" src=\"images/map/navigateDown.png\" onmouseover=\"this.src='images/map/navigateDownSelected.png';\" onmouseout=\"this.src='images/map/navigateDown.png';\">");
out.println("</a>");
} else {
out.println("<img border=\"0\" alt=\"vv\" src=\"images/map/navigateDownNA.png\" title=\"Already at lower map edge\">");
}
out.println("</td>");
out.println("<td></td>");
out.println("</tr>");
out.println("</table>");
// print the image map
out.println(mapData.getImageMap());
// print documents on the selected unit
if (params.pointSelection != null) {
if (SOMMap.som.growingLayer.isValidUnitLocation(params.pointSelection)) {
String[] names = SOMMap.som.growingLayer.getUnit(params.pointSelection.x, params.pointSelection.y).getMappedInputNames();
out.println("<b>Selected unit " + params.pointSelection.x + "/" + params.pointSelection.y
+ "</b><br>");
out.println("<b>Representative terms:</b> "
+ SOMMap.som.growingLayer.getUnit(params.pointSelection.x, params.pointSelection.y).getUnitLabels()
+ "<br>");
out.println("<b>Assigned documents:</b><br>");
if (names != null) {
for (String name : names) {
out.println("<a target=\"_top\" href=\"" + map.documentDetailLink + "?"
+ map.documentDetailParamName + "=" + name + "\">" + name + "</a>");
}
} else {
out.println("None<br>");
}
out.println("<br>");
} else { // warning for invalid unit selection
out.println("<b>Invalid unit selection " + params.pointSelection.x + "/" + params.pointSelection.x
+ "!<b/><br>");
}
}
// expert mode
if (request.getParameter("expertMode") != null) {
out.println("<form>");
// pass on parameters
printHiddenFormInput(request, out, "fodokId");
printHiddenFormInput(request, out, "fodokIds");
printHiddenFormInput(request, out, "expertMode");
printHiddenFormInput(request, out, "dataMode");
// controls for changing palette, visualisation and visualisation specific parameters
out.println(ServerPalettes.getPaletteControl(params.palette));
out.println(ServerVisualizations.getVisualisationsControl(params.vis));
BackgroundImageVisualizer backgroundImageVisualizer = Visualizations.getVisualizationByName(params.vis).getVis();
out.println(backgroundImageVisualizer.getHTMLVisualisationControl(request.getParameterMap()));
out.println("<input type=\"submit\" value=\"Update!\">");
out.println("</form>");
if (true) {
}
}
// data mode - print all data items in a table
if (request.getParameter("dataMode") != null) {
String[] names = SOMMap.som.growingLayer.getAllMappedDataNames();
out.println("<b>All documents:</b><br>");
out.println("<span style=\"font-size:xx-small;\">");
out.println("<table style=\"font-size:xx-small;\">");
int columnCount = 10;
if (names[0].length() > 30) {
columnCount = 5;
}
for (int i = 0; i < names.length; i++) {
if (i % columnCount == 0) {
out.println("<tr>");
}
String displayName = names[i];
int maxLengt = 40;
if (displayName.length() > maxLengt) {
displayName = displayName.substring(0, maxLengt - 3) + "...";
}
out.println("<td style=\"font-size:xx-small; padding-left: 5px; padding-right: 5px;\"><a href=\"map?fodokIds="
+ names[i]
+ params.linkParams
+ "\" title=\""
+ names[i]
+ "\">"
+ displayName
+ "</a></td>");
if (i + 1 % columnCount == 0) {
out.println("</tr>");
}
}
out.println("</table>");
}
} catch (LayerAccessException e) {
e.printStackTrace();
}
}
private void printHiddenFormInput(HttpServletRequest request, ServletOutputStream out, String paramName)
throws IOException {
if (request.getParameter(paramName) != null && request.getParameter(paramName).trim().length() > 0) {
out.print("<input type=\"hidden\" name=\"" + paramName + "\" value=\"" + request.getParameter(paramName)
+ "\">");
}
}
}