/*- ******************************************************************************* * Copyright (c) 2011, 2015 Diamond Light Source Ltd. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Matthew Gerring - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.dawnsci.remotedataset.server.info; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.io.ILoaderService; import org.eclipse.dawnsci.remotedataset.ServiceHolder; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.DTypeUtils; import org.eclipse.january.dataset.IDynamicDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.metadata.DimensionMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The handler for incoming requests. No work should be done here * the request should be delegated down to the backing LoaderFactory instance * using the current session. * * In this way if someone does a slice which is time consuming, another request coming * in will not be blocked while it is done. * * Gives info about a given ILazyDataset, specifically: * name * shape * dType * elements per item * * For example: http://localhost:8080/info/?path=c%3A/Work/results/TomographyDataSet.hdf5 * Gives: * dark_data [37, 1024, 1024] 2 1 * Or: http://localhost:8080/info/?path=c%3A/Work/results/TomographyDataSet.hdf5&dataset=/entry/exchange/data * Gives: data [720, 1024, 1024] 2 1 * * @author Matthew Gerring * */ public class InfoServlet extends HttpServlet { private static Logger logger = LoggerFactory.getLogger(InfoServlet.class); /** * */ private static final long serialVersionUID = 371241872556958998L; protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doHandle(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doHandle(req, resp); } /** * Remember with servlets each of these is done on a thread from the * pool. Therefore it should filter down giving each session its * own object with which to slice. In this way if a user decides to * do a long running slice, they only block themselves. * * TODO User should be able to cancel slice... * */ private void doHandle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { final String path = request.getParameter("path"); final String dataset = request.getParameter("dataset"); try { final ILoaderService lservice = ServiceHolder.getLoaderService(); final IDataHolder holder = lservice.getData(path, true, new IMonitor.Stub()); final ILazyDataset lz = dataset!=null && !"".equals(dataset) ? holder.getLazyDataset(dataset) : holder.getLazyDataset(0); if (lz instanceof IDynamicDataset) { ((IDynamicDataset)lz).refreshShape(); } response.getWriter().println(lz.getName()); response.getWriter().println(Arrays.toString(lz.getShape())); response.getWriter().println(DTypeUtils.getDTypeFromClass(lz.getElementClass())); response.getWriter().println(lz.getElementsPerItem()); // Probably 1 List<DimensionMetadata> dmds = lz.getMetadata(DimensionMetadata.class); if (dmds != null && dmds.size() > 0) { DimensionMetadata dmd = dmds.get(0); response.getWriter().println(Arrays.toString(dmd.getDataMaxDimensions())); response.getWriter().println(Arrays.toString(dmd.getDataChunkDimensions())); } } catch (Exception e) { logger.trace("Invalid dataset loaded from "+path, e); response.setContentType("text/html;charset=utf-8"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); response.getWriter().println("<h1>"+e.getMessage()+"</h1>"); } } }