package hep.aida.web.taglib.util;
import hep.aida.web.taglib.PlotterRegistry;
import hep.aida.web.taglib.PlotterTagSupport;
import hep.aida.web.taglib.RegionTagSupport;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import org.freehep.util.export.ExportFileType;
import org.freehep.util.export.ExportFileTypeGroups;
/**
* Various utility functions for the tags.
*
* @author The AIDA Team @ SLAC
*
*/
public abstract class PlotUtils {
private static int mapCounter = 0;
private static Map scopeMap = new HashMap();
private static PlotterHelper plotterHelper = null;
private static String propertiesFile = "/freehepWebapp.properties";
static {
scopeMap.put("page", new Integer(PageContext.PAGE_SCOPE));
scopeMap.put("request", new Integer(PageContext.REQUEST_SCOPE));
scopeMap.put("session", new Integer(PageContext.SESSION_SCOPE));
scopeMap.put("application", new Integer(PageContext.APPLICATION_SCOPE));
}
public static PlotterHelper getPlotterHelper() {
if ( plotterHelper == null ) {
Properties props = new Properties();
InputStream input = null;
try {
input = PlotUtils.class.getResourceAsStream(propertiesFile);
if (input != null)
props.load(input);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (input!= null) {
input.close();
}
} catch (java.io.IOException ex) {
ex.printStackTrace();
}
}
String plotterHelperClass = props.getProperty("hep.aida.web.plotterhelper","hep.aida.web.taglib.DefaultPlotterHelper");
try {
plotterHelper = (PlotterHelper) Class.forName(plotterHelperClass).getConstructor(new Class[0]).newInstance(new Object[0]);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return plotterHelper;
}
public static int getScope(String scopeName) {
return ((Integer) scopeMap.get(scopeName)).intValue();
}
public static String createHtml(HttpServletRequest request,
PlotCommand plotCommand, PlotterTagSupport plotterTagSupport) {
StringBuffer buffer = new StringBuffer(createImageTag(request,
plotCommand, plotterTagSupport));
if (plotCommand.isAllowDownload()) {
buffer.append(createDownloadLinks(request, plotCommand));
}
return buffer.toString();
}
private static String createImageTag(HttpServletRequest request,
PlotCommand plotCommand, PlotterTagSupport plotterTagSupport) {
StringBuffer buffer;
buffer = new StringBuffer("<img width=\"");
buffer.append(plotCommand.getWidth());
buffer.append("\" height=\"");
buffer.append(plotCommand.getHeight());
buffer.append("\" src=\"");
buffer.append(urlEncode(request, plotCommand)+"\"");
String mapName = "gridMap"+mapCounter;
if ( plotCommand.createImageMap() ) {
mapCounter = mapCounter > 999 ? 0 : mapCounter + 1;
buffer.append(" usemap=\"#"+mapName+"\"");
}
buffer.append("/>");
if ( plotCommand.createImageMap() ) {
buffer.append("\n<map name=\""+mapName+"\">");
int nRegions = plotterTagSupport.numberOfRegions();
int width = plotterTagSupport.getWidth();
int height = plotterTagSupport.getHeight();
for ( int i = 0; i < nRegions; i++ ) {
RegionTagSupport regionTagSupport = plotterTagSupport.regionTagSupport(i);
String href = regionTagSupport.getHref();
if ( href != null && ! href.equals("")) {
int xUpperCorner = (int)(regionTagSupport.getX()*width);
int yUpperCorner = (int)(regionTagSupport.getY()*height);
int xLowerCorner = xUpperCorner + (int)(regionTagSupport.getWidth()*width);
int yLowerCorner = yUpperCorner + (int)(regionTagSupport.getHeight()*height);
buffer.append("\n<area shape=\"rect\" coords=\""+xUpperCorner+","+yUpperCorner+","+xLowerCorner+","+yLowerCorner+"\" href=\""+href+"\"/>");
}
}
buffer.append("\n</map>\n");
}
String img = buffer.toString();
return img;
}
private static String createDownloadLinks(HttpServletRequest request,
PlotCommand plotCommandTemplate) {
PlotCommand plotCommand = new PlotCommand();
plotCommand.setName(plotCommandTemplate.getName());
plotCommand.setWidth(plotCommandTemplate.getWidth());
plotCommand.setHeight(plotCommandTemplate.getHeight());
plotCommand.setAllowDownload(true);
StringBuffer buffer = new StringBuffer("\n<p>Download:");
ExportFileTypeGroups groups = new ExportFileTypeGroups(ExportFileType.getExportFileTypes());
String[] groupNames = { ExportFileTypeGroups.VECTOR, ExportFileTypeGroups.BITMAP };
for (int i=0; i<groupNames.length; i++) {
if (i != 0) buffer.append(", ");
buffer.append("\n(<i>");
buffer.append(groupNames[i]);
buffer.append("</i>)\n");
List types = groups.getExportFileTypes(groupNames[i]);
Iterator iterator = types.iterator();
while (iterator.hasNext()) {
ExportFileType fileType = (ExportFileType) iterator.next();
String format = fileType.getExtensions()[0];
if ( format.equals("bmp") || format.equals("wbmp") || format.equals("raw") )
continue;
plotCommand.setFormat(format);
buffer.append("\n");
buffer.append(" <a href=\"");
buffer.append(urlEncode(request, plotCommand));
buffer.append("\">");
buffer.append(format);
buffer.append("</a>\n");
}
}
buffer.append("</p>\n");
return buffer.toString();
}
private static String urlEncode(HttpServletRequest request,
PlotCommand plotCommand) {
StringBuffer buffer;
buffer = new StringBuffer(request.getContextPath());
buffer.append("/aida_plot.jsp?name=");
buffer.append(plotCommand.getName());
buffer.append("&width=");
buffer.append(plotCommand.getWidth());
buffer.append("&height=");
buffer.append(plotCommand.getHeight());
buffer.append("&format=");
buffer.append(plotCommand.getFormat());
String url = buffer.toString();
return url;
}
public static String printPlotRegistry(HttpSession session) {
System.out.println("*** Printing plot reigstry for session "+session.getId());
Object obj = session.getAttribute(PlotterRegistry.REGISTRY_SESSION_NAME);
if ( obj != null )
return ((PlotterRegistry)obj).printPlotRegistry();
return "no Plotter Registry found";
}
public static void clearPlotRegistry(HttpSession session) {
System.out.println("*** Clearing plot reigstry for session "+session.getId());
Object obj = session.getAttribute(PlotterRegistry.REGISTRY_SESSION_NAME);
if ( obj != null )
((PlotterRegistry)obj).clear();
}
}