Example usage for javax.servlet.http HttpServletRequestWrapper setAttribute

List of usage examples for javax.servlet.http HttpServletRequestWrapper setAttribute

Introduction

In this page you can find the example usage for javax.servlet.http HttpServletRequestWrapper setAttribute.

Prototype

public void setAttribute(String name, Object o) 

Source Link

Document

The default behavior of this method is to return setAttribute(String name, Object o) on the wrapped request object.

Usage

From source file:edu.harvard.hul.ois.pds.ws.PDSWebService.java

public static void printError(HttpServletRequest req, HttpServletResponse res, String message, Throwable e) {
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(req);
    wrapper.setAttribute("message", message);
    wrapper.setAttribute("pdsUrl", req.getContextPath());
    wrapper.setAttribute("exception", e);
    wrapper.setAttribute("req", req);
    RequestDispatcher rd = req.getRequestDispatcher("/api-error.jsp?");
    try {/* w  w w. j av  a2 s  .co  m*/
        rd.forward(req, res);
    } catch (Exception e1) {
        e1.printStackTrace();
    }
}

From source file:edu.harvard.hul.ois.pds.ws.PDSWebService.java

/**
 * Process HTTP GET request./*  w ww . ja  v a2s .  c  o m*/
*/
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, FileNotFoundException {

    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(req);

    //Get parameters from the URL
    String sOp = req.getParameter("op");
    char op = 'f';
    if (sOp != null) {
        op = sOp.charAt(0);
    }

    String uri = req.getRequestURI();
    uri = uri.substring(1);
    String[] uriElements = uri.split("/");
    Integer id = null;
    String action = null;
    if (uriElements.length > 2) {
        action = uriElements[1];
        if (action.equalsIgnoreCase(API_SEARCH)) //go straight to fts
        {
            String docParam;
            if ((uriElements[2]).equalsIgnoreCase("global")) {
                docParam = "";
            } else {
                try {
                    id = new Integer(uriElements[2]);
                } catch (Exception e) {
                    printError(req, res, "Invalid DRS ID", null);
                    return;
                }
                docParam = "G=" + id + "&";
            }
            String format = "";
            format = req.getParameter("F");
            if (format != null) {
                format = "&F=" + format;
            } else {
                format = "&F=M";
            }
            String range = "";
            String advparams = "";
            range = req.getParameter("B");
            if (range != null) {
                range = "&B=" + range;
            } else {
                range = "";
            }
            String dataQualification = "";
            dataQualification = req.getParameter("D");
            if (dataQualification != null) {
                dataQualification = "&D=" + dataQualification;
            } else {
                dataQualification = "";
            }
            String contextScope = "";
            contextScope = req.getParameter("C");
            if (contextScope != null) {
                contextScope = "&C=" + contextScope;
            } else {
                contextScope = "";
            }
            String jumplistRefs = "";
            jumplistRefs = req.getParameter("J");
            if (jumplistRefs != null) {
                jumplistRefs = "&J=" + jumplistRefs;
            } else {
                jumplistRefs = "";
            }
            String lowerDate = "";
            lowerDate = req.getParameter("L");
            if (lowerDate != null) {
                lowerDate = "&L=" + lowerDate;
            } else {
                lowerDate = "";
            }
            String upperDate = "";
            upperDate = req.getParameter("U");
            if (upperDate != null) {
                upperDate = "&U=" + upperDate;
            } else {
                upperDate = "";
            }
            String resultsize = "";
            resultsize = req.getParameter("P");
            if (resultsize != null) {
                resultsize = "&P=" + resultsize;
            } else {
                resultsize = "";
            }
            advparams = resultsize + range + dataQualification + contextScope + jumplistRefs + lowerDate
                    + upperDate;

            //Log the search page request
            WebAppLogMessage message = new WebAppLogMessage(req, true);
            message.setContext("search");
            message.setMessage("Search Request: " + id);
            logger.info(message);
            String Query = req.getParameter("Q");
            if (Query == null) {
                Query = "";
            }
            try {
                String queryString = new String("?" + docParam + "Q=" + Query + format + advparams);
                wrapper.setAttribute("searchurl", ftsUrl + queryString);
                RequestDispatcher rd = req.getRequestDispatcher("/api-search.jsp?");
                rd.forward(req, res);
                //res.sendRedirect(ftsUrl+queryString);
                return;
            } catch (Exception e) {
                message = new WebAppLogMessage(req, true);
                message.setContext("main");
                Throwable root = e;
                if (e instanceof ServletException) {
                    ServletException se = (ServletException) e;
                    Throwable t = se.getRootCause();
                    if (t != null) {
                        logger.error(message, t);
                        root = t;
                    } else {
                        logger.error(message, se);
                    }
                } else {
                    logger.error(message, e);
                }
                printError(req, res, "PDS-WS Error", root);
            }

        }
        try {
            id = new Integer(uriElements[2]);
        } catch (Exception e) {
        }
    }
    if (id == null) {
        printError(req, res, "Invalid DRS ID", null);
        return;
    }

    String n = req.getParameter("n");
    if (n == null) {
        n = "1";
    } else if (n.equals("")) {
        printError(req, res, "Page not found", null);
        return;
    }
    //Set scaling factors. s overrides imagesize.  Image size select
    //boxes are based on S.
    String scale = req.getParameter("s");
    String imagesize = req.getParameter("imagesize");
    if (scale == null || !(scale.equals("2") || scale.equals("4") || scale.equals("6") || scale.equals("8"))) {
        if (imagesize != null && imagesize.equals("300")) {
            scale = "8";
        } else if (imagesize != null && imagesize.equals("600")) {
            scale = "6";
        } else if (imagesize != null && imagesize.equals("1200")) {
            scale = "4";
        } else if (imagesize != null && imagesize.equals("2400")) {
            scale = "2";
        } else {
            scale = "4";
        }
    }
    if (imagesize == null || !(imagesize.equals("300") || imagesize.equals("600") || imagesize.equals("1200")
            || imagesize.equals("2400"))) {
        if (scale.equals("2")) {
            imagesize = "2400";
        } else if (scale.equals("4")) {
            imagesize = "1200";
        } else if (scale.equals("6")) {
            imagesize = "600";
        } else if (scale.equals("8")) {
            imagesize = "300";
        }
    }
    String jp2Rotate = req.getParameter("rotation");
    if (jp2Rotate == null || jp2Rotate.equals("360") || jp2Rotate.equals("-360")) {
        jp2Rotate = "0";
    } else if (jp2Rotate.equals("-90")) {
        jp2Rotate = "270";
    }
    String jp2x = req.getParameter("jp2x");
    if (jp2x == null) {
        jp2x = "0";
    }
    String jp2y = req.getParameter("jp2y");
    if (jp2y == null) {
        jp2y = "0";
    }
    String jp2Res = req.getParameter("jp2Res");

    String bbx1 = req.getParameter("bbx1");
    if (bbx1 == null) {
        bbx1 = "0";
    }
    String bby1 = req.getParameter("bby1");
    if (bby1 == null) {
        bby1 = "0";
    }
    String bbx2 = req.getParameter("bbx2");
    if (bbx2 == null) {
        bbx2 = "0";
    }
    String bby2 = req.getParameter("bby2");
    if (bby2 == null) {
        bby2 = "0";
    }
    String printThumbnails = req.getParameter("printThumbnails");
    if (printThumbnails == null) {
        printThumbnails = "no";
    }
    wrapper.setAttribute("printThumbnails", printThumbnails);

    //cg debug
    System.out.println("debug1- imagesize: " + imagesize + " jp2Res: " + jp2Res + " scale: " + scale);

    String clickX = req.getParameter("thumbnail.x");
    if (clickX != null) {
        wrapper.setAttribute("clickX", clickX);
    } else {
        clickX = (String) wrapper.getAttribute("clickX");
    }
    String clickY = req.getParameter("thumbnail.y");
    if (clickX != null) {
        wrapper.setAttribute("clickY", clickY);
    } else {
        clickY = (String) wrapper.getAttribute("clickY");
    }
    //cg debug
    System.out.println("debug1- thumbnail.x: " + clickX);
    System.out.println("debug1- X: " + req.getParameter("x"));
    System.out.println("debug1- thumbnail.y: " + clickY);
    System.out.println("debug1- Y: " + req.getParameter("y"));

    /**********************************************************
     * Create new, or use existing Session
     **********************************************************/
    HttpSession session = req.getSession(true);

    PdsUserState pdsUser = (PdsUserState) session.getAttribute("PdsUser");
    CacheItem item = memcache.getObject(pdsUser.getMeta());
    InternalMets mets = item.getMets();

    //compare request header if-modified-since with METS DRS last modified
    //TODO This is temporarily disabled to allow crawlers access to updated
    // content that they may have already indexed
    /*
    Date metsLastModified = item.getLastModifiedDate();
    try {
       long header = req.getDateHeader("If-Modified-Since");
       if (header > 0) {
    Date headerDate = new Date(header);
    if (metsLastModified.before(headerDate)) {
       res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
       return;
    }
       }
    } catch (Exception e) {
       e.printStackTrace();
       // we just ignore this
    }
    */

    //Set the last modified response value
    //TODO Warning - this causes browsers to have problems refreshing the
    // navigation tree html.  Possibly this can be set for the content and
    // citation frames?
    //res.setDateHeader("Last-Modified", metsLastModified.getTime());

    /******************************************************************************
     *  Get the flags for if doing a page number (p) or sequence number(s) page find
     *  If p is null, look up sequence, if it is not null, look up with page number.
     * if getContentPage returns null, the page does not exist or an invalid number was
     * entered.
     ******************************************************************************/
    PageDiv pdiv = null;
    try {
        String pageMode = req.getParameter("P");
        if (pageMode == null || !pageMode.equals("p")) {
            pageMode = "s";
        }
        //if a page number search trim n
        if (pageMode.equals("p")) {
            n = n.replace(']', ' ');
            n = n.replace('[', ' ');
            n = n.trim();
        }
        pdiv = mets.getContentPage(n, pageMode);
        //if pdiv is a jpeg2000 and res is null then calculate default res value
        //SET DEFAULT SIZE IF RES NOT SET
        if (jp2Res == null && pdiv.getDefaultImageMimeType().equals("image/jp2")) {

            //judaica fix
            int maxJP2sz = getMaxJP2DisplaySize(pdiv.getDefaultImageID());
            if ((maxJP2sz > 300) && (maxJP2sz < 600)) {
                maxJP2sz = 300;
                scale = "8";
            } else if ((maxJP2sz > 600) && (maxJP2sz < 1200)) {
                maxJP2sz = 600;
                scale = "6";
            } else if ((maxJP2sz > 1200) && (maxJP2sz < 2400)) {
                maxJP2sz = 1200;
                scale = "4";
            } else if (maxJP2sz > 2400) {
                maxJP2sz = 2400;
                scale = "2";
            }
            String origImagesize = imagesize;
            if (Integer.parseInt(imagesize) > maxJP2sz) {
                imagesize = Integer.toString(maxJP2sz);
            }

            String filepath = getFilePath(pdiv.getDefaultImageID());
            Jpeg2000 jp2 = new Jpeg2000(new File(filepath));
            int newRes = jp2.findResolutionLevelContainedBy(Integer.parseInt(origImagesize),
                    Integer.parseInt(origImagesize));

            //convert Res to a scaling decimal
            if (newRes == 1)
                jp2Res = "1";
            else if (newRes == 2)
                jp2Res = ".5";
            else if (newRes == 3)
                jp2Res = ".25";
            else if (newRes == 4)
                jp2Res = ".125";
            else if (newRes == 5)
                jp2Res = ".0625";
            else if (newRes > 5) {
                jp2Res = "0.625";
            }
            //recalculate newRes if judaica maxres has changed
            //the actual imagesize
            if (!imagesize.equals(origImagesize)) {
                int oldImgsize = Integer.parseInt(origImagesize);
                int newImgsize = Integer.parseInt(imagesize);
                float factor = (oldImgsize / newImgsize) / 2;
                System.out.println("new factor: " + Double.toString(factor));
                jp2Res = Double.toString(Double.parseDouble(jp2Res) / factor);
            }

            //cg debug
            //System.out.println("debug2- newRes: " + newRes + " jp2Res is now: " + jp2Res + " scale: " + scale );
        }
        if (pdiv != null && pageMode.equals("p")) {
            n = String.valueOf(pdiv.getOrder());
            //to keep n in the address bar current, redirect to new URL with equivalent n value of page number
            res.sendRedirect(pdsUrl + "/view/" + id + "?n=" + n + "&s=" + scale
                    + (imagesize != null ? "&imagesize=" + imagesize : "")
                    + (jp2Res != null ? "&jp2Res=" + jp2Res : "")
                    + (jp2Rotate != null ? "&rotation=" + jp2Rotate : ""));
            return;
        }
    } catch (Exception e) {
        WebAppLogMessage message = new WebAppLogMessage();
        message.setContext("find page");
        message.setMessage("invalid page number");
        message.processSessionRequest(req);
        logger.error(message, e);
    }
    if (pdiv == null) {
        printError(req, res, "Page not found", null);
        return;
    }
    /**********************************************************
     *  Process appropriately based on the op variable.
     **********************************************************/
    try {
        /*************************
         * If image is a JP2 and this is not a frame request, figure
         * out x,y to create bounding box on thumbnail
         ***********************/
        if (pdiv.getDefaultImageMimeType().equals("image/jp2")
                && (op != OP_CITATION && op != OP_CONTENT && op != OP_NAVIGATION)) {

            //judaica fix
            int maxJP2size = getMaxJP2DisplaySize(pdiv.getDefaultImageID());
            if ((maxJP2size > 300) && (maxJP2size < 600)) {
                maxJP2size = 300;
                scale = "8";
            } else if ((maxJP2size > 600) && (maxJP2size < 1200)) {
                maxJP2size = 600;
                scale = "6";
            } else if ((maxJP2size > 1200) && (maxJP2size < 2400)) {
                maxJP2size = 1200;
                scale = "4";
            } else if (maxJP2size > 2400) {
                maxJP2size = 2400;
                scale = "2";
            }
            if (Integer.parseInt(imagesize) > maxJP2size) {
                imagesize = Integer.toString(maxJP2size);
            }
            String jp2Action = req.getParameter("action");
            if (jp2Action == null) {
                jp2Action = "noaction";
            }
            int vHeight = Integer.parseInt(imagesize);
            int vWidth = Integer.parseInt(imagesize);
            double imgres = Double.parseDouble(jp2Res);
            //int tWidth = Integer.parseInt(req.getParameter("thumbwidth"));
            //int tHeight = Integer.parseInt(req.getParameter("thumbheight"));
            String filepath = getFilePath(pdiv.getDefaultImageID());
            Coordinate dimension = new Coordinate();
            int x = Integer.parseInt(jp2x);
            int y = Integer.parseInt(jp2y);
            Jpeg2000 jp2 = new Jpeg2000(new File(filepath));

            //String clickX = req.getParameter("thumbnail.x");
            //String clickY = req.getParameter("thumbnail.y");
            int thumbX = -1;
            int thumbY = -1;
            if (clickX != null && clickY != null) {
                thumbX = Integer.parseInt(clickX);
                thumbY = Integer.parseInt(clickY);
            }
            if (jp2Action.equals("noaction")) {
                thumbX = 0;
                thumbY = 0;
            } else if (jp2Action.equals("jp2pan")) {
                x = thumbX;
                y = thumbY;
                //panThumbnail is passed thumbnail scale coordinates. It returns
                //thumbnail scale coordinates so the new X and Y do not need to be
                //extracted from the method return object
                dimension = UIUtil.panThumbnail(vHeight, vWidth, x, y, imgres, jp2, jp2Rotate);
            } else if (jp2Action.equals("jp2zoomin")) {
                dimension = UIUtil.zoom(vHeight, vWidth, x, y, imgres, jp2, true, jp2Rotate);
                Coordinate c = UIUtil.convertFullSizeCoordate(jp2, dimension.getX(), dimension.getY(), vWidth,
                        vHeight, imgres, jp2Rotate);
                thumbX = c.getX();
                thumbY = c.getY();
            } else if (jp2Action.equals("jp2zoomout")) {
                dimension = UIUtil.zoom(vHeight, vWidth, x, y, imgres, jp2, false, jp2Rotate);
                Coordinate c = UIUtil.convertFullSizeCoordate(jp2, dimension.getX(), dimension.getY(), vWidth,
                        vHeight, imgres, jp2Rotate);
                thumbX = c.getX();
                thumbY = c.getY();
            } else if (jp2Action.equals("jp2resize")) {
                String pres = req.getParameter("pres");
                double pvRes = Double.valueOf(pres);
                String previousWidth = req.getParameter("pvWidth");
                String previousHeight = req.getParameter("pvHeight");
                int pvWidth = Integer.parseInt(previousWidth);
                int pvHeight = Integer.parseInt(previousHeight);
                dimension = UIUtil.centerOnResize(vHeight, vWidth, pvHeight, pvWidth, pvRes, x, y, imgres, jp2,
                        jp2Rotate);
                Coordinate c = UIUtil.convertFullSizeCoordate(jp2, dimension.getX(), dimension.getY(), vWidth,
                        vHeight, imgres, jp2Rotate);
                thumbX = c.getX();
                thumbY = c.getY();
            } else if (jp2Action.equals("jp2rotate")) {
                dimension = UIUtil.panThumbnail(vHeight, vWidth, 0, 0, imgres, jp2, jp2Rotate);
                thumbX = 0;
                thumbY = 0;
            }

            jp2x = String.valueOf(dimension.getX());
            jp2y = String.valueOf(dimension.getY());
            req.setAttribute("jp2x", jp2x);
            req.setAttribute("jp2y", jp2y);

            //set up coordinates to draw bounding box on thumbnail
            CoordinatePair bbCoors = UIUtil.getBoundingBoxDimensions(jp2, imgres, vWidth, vHeight, thumbX,
                    thumbY, jp2Rotate);
            bbx1 = Integer.toString(bbCoors.getPoint1().getX());
            bby1 = Integer.toString(bbCoors.getPoint1().getY());
            bbx2 = Integer.toString(bbCoors.getPoint2().getX());
            bby2 = Integer.toString(bbCoors.getPoint2().getY());
        }

        wrapper.setAttribute("cite", mets.getCitationDiv());
        wrapper.setAttribute("pdiv", pdiv);
        /*if(action.equalsIgnoreCase(ACTION_VIEW) || action.equalsIgnoreCase(ACTION_VIEW_TEXT)) {
           int imageId = pdiv.getDefaultImageID();
             wrapper.setAttribute("lastPage",String.valueOf(mets.getCitationDiv().getLastPageNumber()));
             wrapper.setAttribute("imageId",String.valueOf(imageId));
             wrapper.setAttribute("id",id);
             wrapper.setAttribute("n",n);
             wrapper.setAttribute("s",scale);
             wrapper.setAttribute("mime",pdiv.getDefaultImageMimeType());
             wrapper.setAttribute("filepath",getFilePath(imageId));
             wrapper.setAttribute("idsUrl",idsUrl);
             wrapper.setAttribute("cache",cache);
             wrapper.setAttribute("cacheUrl",pdsUrl+cacheUrl);
             wrapper.setAttribute("jp2Rotate",jp2Rotate);
             wrapper.setAttribute("jp2Res",jp2Res);
             wrapper.setAttribute("jp2x",jp2x);
             wrapper.setAttribute("jp2y",jp2y);
             wrapper.setAttribute("imagesize",imagesize);
             wrapper.setAttribute("bbx1",bbx1);
             wrapper.setAttribute("bby1",bby1);
             wrapper.setAttribute("bbx2",bbx2);
             wrapper.setAttribute("bby2",bby2);
             wrapper.setAttribute("pdsUrl",pdsUrl);
             wrapper.setAttribute("ids",idsUrl);
             wrapper.setAttribute("action",action);
                
           if (op == OP_CITATION)   {
                                if( pdiv.getDefaultImageMimeType().equals("image/jp2") ) {
                                    //get max res for biling code
                                    wrapper.setAttribute("maxjp2res", Integer.toString(getMaxJP2DisplaySize(pdiv.getDefaultImageID())) );
                                }
              RequestDispatcher rd = req.getRequestDispatcher("/citation.jsp?");
              rd.forward(req,res);
           }
           else if (op == OP_CONTENT)   {
         //get paths of the ocr files
         ArrayList<String> ocrPaths = new ArrayList<String>();
         for(int i=0;i<pdiv.getOcrID().size();i++) {
            Integer ocr = (Integer) pdiv.getOcrID().get(i);
            ocrPaths.add(getFilePath(ocr.intValue()));
         }
         wrapper.setAttribute("ocrList",ocrPaths);
                
         //if image is a tiff, convert to gif
         if(pdiv.getDefaultImageMimeType().equals("image/tiff")) {
            String delv = cache + "/" + imageId + "-" + scale + ".gif";
          File file = new File (delv);
          if (!file.exists ()) {
             Runtime rt = Runtime.getRuntime();
             String tiffpath = getFilePath(imageId);
             String exec = giffy + " id=" + imageId + " path=" +
                tiffpath.substring(0,tiffpath.lastIndexOf("/")) + " scale=" + scale +
                " cache=" + cache;
             Process child = rt.exec (exec);
             child.waitFor();
             child.destroy();
          }
         }
         wrapper.setAttribute("caption",item.getImageCaption());
              RequestDispatcher rd = req.getRequestDispatcher("/content.jsp?");
              rd.forward(req,res);
                
           }
           else if (op == OP_NAVIGATION) {
              String treeIndex = req.getParameter("index");
              String treeAction = req.getParameter("treeaction");
                
              if (treeAction != null) {
          if (treeAction.equalsIgnoreCase("expand")) {
             pdsUser.setExpandedNodes(id,item.getAllNodesIndices());
          }
          else if (treeAction.equalsIgnoreCase("collapse")) {
             pdsUser.setExpandedNodes(id,new ArrayList<String>());
          }
              }
              if(treeIndex != null) {
          pdsUser.toggleNode(id,treeIndex);
              }
              wrapper.setAttribute("pdsUser",pdsUser);
                                wrapper.setAttribute("maxThumbnails", maxThumbnails);
              //wrapper.setAttribute("toggleIndex",toggleIndex);
              //wrapper.setAttribute("treeaction",treeAction);
              RequestDispatcher rd = req.getRequestDispatcher("/navigation.jsp?");
              rd.forward(req,res);
           }
           else {
              //Log the frameset request
            WebAppLogMessage message = new WebAppLogMessage(req, true);
            message.setContext("frameset");
            message.setMessage("Frameset Request: " + id);
            logger.info(message);
              RequestDispatcher rd = req.getRequestDispatcher("/frameset.jsp?");
              rd.forward(req,res);
           }
        }
        else if (action.equalsIgnoreCase(ACTION_CITE_INFO)) {
          WebAppLogMessage message = new WebAppLogMessage(req, true);
           message.setContext("fullcitation");
           message.setMessage("Full Citation: " + id + " Seq: " + n);
           logger.info(message);
         wrapper.setAttribute("cite",mets.getCitationDiv());
         wrapper.setAttribute("pdsUrl",pdsUrl);
         wrapper.setAttribute("id",id);
         wrapper.setAttribute("nStr", n+"");
                
         String repos = pdsUser.getMeta().getOwner();
         if (repos == null || repos.equals(""))
            repos = "Harvard University Library";
         String mainUrn =    pdsUser.getMeta().getUrn();
         String pageUrn = pdsUser.getMeta().getUrnFromList("?n=" +n);
           SimpleDateFormat sdf =
              new SimpleDateFormat("dd MMMM yyyy");
           String accDate =  sdf.format(new Date());
           wrapper.setAttribute("accDate", accDate);
         wrapper.setAttribute("repos", repos);
         wrapper.setAttribute("mainUrn", nrsUrl + "/" +mainUrn);
         wrapper.setAttribute("pageUrn", nrsUrl + "/" + pageUrn);
         StringBuffer sb = new StringBuffer("");
         getAllSectionLabels(mets.getCitationDiv(), Integer.parseInt(n), sb);
         sb.delete(0,2);
         wrapper.setAttribute("sectLabels", sb.toString());
         RequestDispatcher rd = req.getRequestDispatcher("/fullcitation.jsp?");
              rd.forward(req,res);
        }
        else if (action.equalsIgnoreCase(ACTION_SEARCH)) {
           //Log the search page request
        WebAppLogMessage message = new WebAppLogMessage(req, true);
        message.setContext("search");
        message.setMessage("Search Request: " + id);
        logger.info(message);
             wrapper.setAttribute("cite",mets.getCitationDiv());
             wrapper.setAttribute("ftsUrl",ftsUrl);
             wrapper.setAttribute("pdsUrl",pdsUrl);
             wrapper.setAttribute("id",id);
        RequestDispatcher rd = req.getRequestDispatcher("/search.jsp?");
           rd.forward(req,res);
        }
        else if (action.equalsIgnoreCase(ACTION_PRINTOPS)) {
        WebAppLogMessage message = new WebAppLogMessage(req, true);
        message.setContext("printops");
        message.setMessage("print options: " + id);
        logger.info(message);
             wrapper.setAttribute("pdsUrl",pdsUrl);
             wrapper.setAttribute("id",id);
             wrapper.setAttribute("n",n);
        RequestDispatcher rd = req.getRequestDispatcher("/printoptions.jsp?");
           rd.forward(req,res);
        }
        else if (action.equalsIgnoreCase(ACTION_PRINT)) {
                   
        }
        else if (action.equalsIgnoreCase(ACTION_LINKS)) {
        WebAppLogMessage message = new WebAppLogMessage(req, true);
        message.setContext("links");
        message.setMessage("display links: " + id);
        logger.info(message);
             wrapper.setAttribute("cite",mets.getCitationDiv());
             wrapper.setAttribute("id",id);
             wrapper.setAttribute("pdsUrl",pdsUrl);
        RequestDispatcher rd = req.getRequestDispatcher("/links.jsp?");
           rd.forward(req,res);
        }*/ //START API CALLS
        if (action.equalsIgnoreCase(API_VIEW) || action.equalsIgnoreCase(API_VIEW_TEXT)) { //main api function. shows ocr'd pages

            int imageId = pdiv.getDefaultImageID();
            wrapper.setAttribute("lastPage", String.valueOf(mets.getCitationDiv().getLastPageNumber()));
            wrapper.setAttribute("imageId", String.valueOf(imageId));
            wrapper.setAttribute("id", id);
            wrapper.setAttribute("n", n);
            wrapper.setAttribute("s", scale);
            wrapper.setAttribute("mime", pdiv.getDefaultImageMimeType());
            wrapper.setAttribute("filepath", getFilePath(imageId));
            wrapper.setAttribute("idsUrl", idsUrl);
            wrapper.setAttribute("cache", cache);
            wrapper.setAttribute("cacheUrl", pdsUrl + cacheUrl);
            wrapper.setAttribute("jp2Rotate", jp2Rotate);
            wrapper.setAttribute("jp2Res", jp2Res);
            wrapper.setAttribute("jp2x", jp2x);
            wrapper.setAttribute("jp2y", jp2y);
            wrapper.setAttribute("imagesize", imagesize);
            wrapper.setAttribute("bbx1", bbx1);
            wrapper.setAttribute("bby1", bby1);
            wrapper.setAttribute("bbx2", bbx2);
            wrapper.setAttribute("bby2", bby2);
            wrapper.setAttribute("pdsUrl", pdsUrl);
            wrapper.setAttribute("ids", idsUrl);
            wrapper.setAttribute("action", action);

            //get paths of the ocr files
            ArrayList<String> ocrPaths = new ArrayList<String>();
            for (int i = 0; i < pdiv.getOcrID().size(); i++) {
                Integer ocr = (Integer) pdiv.getOcrID().get(i);
                ocrPaths.add(getFilePath(ocr.intValue()));
            }
            wrapper.setAttribute("ocrList", ocrPaths);

            //if image is a tiff, convert to gif
            if (pdiv.getDefaultImageMimeType().equals("image/tiff")) {
                String delv = cache + "/" + imageId + "-" + scale + ".gif";
                File file = new File(delv);
                if (!file.exists()) {
                    Runtime rt = Runtime.getRuntime();
                    String tiffpath = getFilePath(imageId);
                    String exec = giffy + " id=" + imageId + " path="
                            + tiffpath.substring(0, tiffpath.lastIndexOf("/")) + " scale=" + scale + " cache="
                            + cache;
                    Process child = rt.exec(exec);
                    child.waitFor();
                    child.destroy();
                }
            }
            wrapper.setAttribute("caption", item.getImageCaption());
            RequestDispatcher rd = req.getRequestDispatcher("/api-content.jsp?");
            rd.forward(req, res);

        } else if (action.equalsIgnoreCase(API_LINKS)) {
            WebAppLogMessage message = new WebAppLogMessage(req, true);
            message.setContext("links");
            message.setMessage("display links: " + id);
            logger.info(message);
            wrapper.setAttribute("cite", mets.getCitationDiv());
            wrapper.setAttribute("id", id);
            wrapper.setAttribute("pdsUrl", pdsUrl);
            wrapper.setAttribute("n", n);
            RequestDispatcher rd = req.getRequestDispatcher("/api-links.jsp?");
            rd.forward(req, res);
        } else if (action.equalsIgnoreCase(API_CITE_INFO)) {
            WebAppLogMessage message = new WebAppLogMessage(req, true);
            message.setContext("fullcitation");
            message.setMessage("Full Citation: " + id + " Seq: " + n);
            logger.info(message);
            wrapper.setAttribute("cite", mets.getCitationDiv());
            wrapper.setAttribute("pdsUrl", pdsUrl);
            wrapper.setAttribute("id", id);
            wrapper.setAttribute("nStr", n + "");

            String repos = pdsUser.getMeta().getOwner();
            if (repos == null || repos.equals(""))
                repos = "Harvard University Library";
            String mainUrn = pdsUser.getMeta().getUrn();
            String pageUrn = pdsUser.getMeta().getUrnFromList("?n=" + n);
            SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
            String accDate = sdf.format(new Date());
            wrapper.setAttribute("accDate", accDate);
            wrapper.setAttribute("repos", repos);
            wrapper.setAttribute("mainUrn", nrsUrl + "/" + mainUrn);
            wrapper.setAttribute("pageUrn", nrsUrl + "/" + pageUrn);
            StringBuffer sb = new StringBuffer("");
            getAllSectionLabels(mets.getCitationDiv(), Integer.parseInt(n), sb);
            sb.delete(0, 2);
            wrapper.setAttribute("sectLabels", sb.toString());
            RequestDispatcher rd = req.getRequestDispatcher("/api-fullcitation.jsp?");
            rd.forward(req, res);
        } else if (action.equalsIgnoreCase(API_DOC_TREE)) {
            String treeIndex = req.getParameter("index");
            String treeAction = req.getParameter("treeaction");

            /*if (treeAction != null)
            {
                if (treeAction.equalsIgnoreCase("expand")) {
                    pdsUser.setExpandedNodes(id,item.getAllNodesIndices());
            }
                else if (treeAction.equalsIgnoreCase("collapse")) {
            pdsUser.setExpandedNodes(id,new ArrayList<String>());
            }
            }
            if(treeIndex != null) {
                    pdsUser.toggleNode(id,treeIndex);
            }*/
            //expand the tree
            pdsUser.setExpandedNodes(id, item.getAllNodesIndices());
            wrapper.setAttribute("pdsUser", pdsUser);
            wrapper.setAttribute("pdsUrl", pdsUrl);
            wrapper.setAttribute("cacheUrl", pdsUrl + cacheUrl);
            wrapper.setAttribute("cache", cache);
            wrapper.setAttribute("id", id);
            wrapper.setAttribute("n", n);
            wrapper.setAttribute("s", scale);
            wrapper.setAttribute("action", "get");
            wrapper.setAttribute("idsUrl", idsUrl);
            wrapper.setAttribute("maxThumbnails", maxThumbnails);
            wrapper.setAttribute("jp2Rotate", jp2Rotate);
            wrapper.setAttribute("jp2x", jp2x);
            wrapper.setAttribute("jp2y", jp2y);
            wrapper.setAttribute("caption", item.getImageCaption());
            //wrapper.setAttribute("toggleIndex",toggleIndex);
            //wrapper.setAttribute("treeaction",treeAction);
            RequestDispatcher rd = req.getRequestDispatcher("/api-navigation.jsp?");
            rd.forward(req, res);
        } //todo?
        else if (action.equalsIgnoreCase(API_MAX_SECTIONS)) {

        } else if (action.equalsIgnoreCase(API_MAX_PAGES)) {

        } else if (action.equalsIgnoreCase(API_MAX_CHAPTERS)) {

        }

    } //END MAIN
    catch (Exception e) {
        WebAppLogMessage message = new WebAppLogMessage(req, true);
        message.setContext("main");
        Throwable root = e;
        if (e instanceof ServletException) {
            ServletException se = (ServletException) e;
            Throwable t = se.getRootCause();
            if (t != null) {
                logger.error(message, t);
                root = t;
            } else {
                logger.error(message, se);
            }
        } else {
            logger.error(message, e);
        }
        printError(req, res, "PDS-WS Error", root);
    }
}