view software/mpdl-services-new/mpiwg-mpdl-cms-web/src/de/mpg/mpiwg/berlin/mpdl/servlets/cms/GetDocInfo.java @ 25:e9fe3186670c default tip

letzter Stand eingecheckt
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 21 May 2013 10:19:32 +0200
parents
children
line wrap: on
line source

package de.mpg.mpiwg.berlin.mpdl.servlets.cms;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;

import de.mpg.mpiwg.berlin.mpdl.cms.document.DocumentHandler;
import de.mpg.mpiwg.berlin.mpdl.cms.document.MetadataRecord;
import de.mpg.mpiwg.berlin.mpdl.cms.lucene.IndexHandler;
import de.mpg.mpiwg.berlin.mpdl.cms.transform.TocTransformer;
import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
import de.mpg.mpiwg.berlin.mpdl.util.Util;

public class GetDocInfo extends HttpServlet {
  private static final long serialVersionUID = 1L;
  private TocTransformer tocTransformer;
  
  public GetDocInfo() {
    super();
  }

  public void init(ServletConfig config) throws ServletException  {
    super.init(config);
    ServletContext context = getServletContext();
    tocTransformer = (TocTransformer) context.getAttribute("tocTransformer");
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    String docId = request.getParameter("docId");
    String field = request.getParameter("field");
    String outputFormat = request.getParameter("outputFormat");
    if (outputFormat == null)
      outputFormat = "xml";
    String cssUrl = request.getParameter("cssUrl");
    if (cssUrl == null) {
      String baseUrl = getBaseUrl(request);
      cssUrl = baseUrl + "/css/page.css";
    }
    try {
      IndexHandler indexHandler = IndexHandler.getInstance();
      MetadataRecord mdRecord = indexHandler.getDocMetadata(docId);
      if (outputFormat.equals("xml"))
        response.setContentType("text/xml");
      else if (outputFormat.equals("html"))
        response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      if (mdRecord != null && outputFormat.equals("xml")) {
        out.print("<doc>");
        out.print("<id>" + docId + "</id>");
        String identifier = mdRecord.getIdentifier();
        if ((field == null || (field != null && field.equals("identifier"))) && identifier != null)
          out.print("<identifier>" + identifier + "</identifier>");
        String uri = mdRecord.getUri();
        if ((field == null || (field != null && field.equals("uri"))) && uri != null)
          out.print("<uri>" + uri + "</uri>");
        String collectionNames = mdRecord.getCollectionNames();
        if ((field == null || (field != null && field.equals("collectionNames"))) && collectionNames != null)
          out.print("<collectionNames>" + collectionNames + "</collectionNames>");
        String author = mdRecord.getCreator();
        if ((field == null || (field != null && field.equals("author"))) && author != null)
          out.print("<author>" + author + "</author>");
        String title = mdRecord.getTitle();
        if ((field == null || (field != null && field.equals("title"))) && title != null)
          out.print("<title>" + title + "</title>");
        String language = mdRecord.getLanguage();
        if ((field == null || (field != null && field.equals("language"))) && language != null)
          out.print("<language>" + language + "</language>");
        String publisher = mdRecord.getPublisher();
        if ((field == null || (field != null && field.equals("publisher"))) && publisher != null)
          out.print("<publisher>" + publisher + "</publisher>");
        String date = mdRecord.getYear();
        if ((field == null || (field != null && field.equals("date"))) && date != null)
          out.print("<date>" + date + "</date>");
        String subject = mdRecord.getSubject();
        if ((field == null || (field != null && field.equals("subject"))) && subject != null)
          out.print("<subject>" + subject + "</subject>");
        String rights = mdRecord.getRights();
        if ((field == null || (field != null && field.equals("rights"))) && rights != null)
          out.print("<rights>" + rights + "</rights>");
        String license = mdRecord.getLicense();
        if ((field == null || (field != null && field.equals("license"))) && license != null)
          out.print("<license>" + license + "</license>");
        String accessRights = mdRecord.getAccessRights();
        if ((field == null || (field != null && field.equals("accessRights"))) && accessRights != null)
          out.print("<accessRights>" + accessRights + "</accessRights>");
        String echoId = mdRecord.getEchoId();
        if ((field == null || (field != null && field.equals("echoId"))) && echoId != null)
          out.print("<echoId>" + echoId + "</echoId>");
        String echoPageImageDir = mdRecord.getEchoPageImageDir();
        if ((field == null || (field != null && field.equals("echoPageImageDir"))) && echoPageImageDir != null)
          out.print("<echoPageImageDir>" + echoPageImageDir + "</echoPageImageDir>");
        String echoFiguresDir = mdRecord.getEchoFiguresDir();
        if ((field == null || (field != null && field.equals("echoFiguresDir"))) && echoFiguresDir != null)
          out.print("<echoFiguresDir>" + echoFiguresDir + "</echoFiguresDir>");
        String mpiwgDocId = mdRecord.getMpiwgDocId();
        if ((field == null || (field != null && field.equals("mpiwgDocId"))) && mpiwgDocId != null)
          out.print("<mpiwgDocId>" + mpiwgDocId + "</mpiwgDocId>");
        if (field == null || (field != null && ! field.equals("toc") && ! field.equals("figures") && ! field.equals("notes") && ! field.equals("notesHandwritten") && ! field.equals("pages") && ! field.equals("places")))
          out.print("<system>");
        int pageCount = mdRecord.getPageCount();
        if (field == null || (field != null && field.equals("countPages")))
          out.print("<countPages>" + pageCount + "</countPages>");
        DocumentHandler docHandler = new DocumentHandler();
        String docDir = docHandler.getDocDir(docId);
        String tocFileName = docDir + "/toc.xml";
        File tocFile = new File(tocFileName);
        String tocStr = FileUtils.readFileToString(tocFile, "utf-8");
        String tocCount = getTocCount(tocStr, "toc");
        out.print("<countTocEntries>" + tocCount + "</countTocEntries>");
        String figuresCount = getTocCount(tocStr, "figures");
        out.print("<countFigures>" + figuresCount + "</countFigures>");
        String notesCount = getTocCount(tocStr, "notes");
        out.print("<countNotes>" + notesCount + "</countNotes>");
        String notesHandwrittenCount = getTocCount(tocStr, "notesHandwritten");
        out.print("<countNotesHandwritten>" + notesHandwrittenCount + "</countNotesHandwritten>");
        String placesCount = getTocCount(tocStr, "places");
        out.print("<countPlaces>" + placesCount + "</countPlaces>");
        Date lastModified = mdRecord.getLastModified();
        if ((field == null || (field != null && field.equals("lastModified"))) && lastModified != null) {
          String lastModifiedStr = new Util().toXsDate(lastModified);
          out.print("<lastModified>" + lastModifiedStr + "</lastModified>");
        }
        String schemaName = mdRecord.getSchemaName();
        if ((field == null || (field != null && field.equals("schema"))) && schemaName != null)
          out.print("<schema>" + schemaName + "</schema>");
        if (field == null || (field != null && ! field.equals("toc") && ! field.equals("figures") && ! field.equals("notes") && ! field.equals("notesHandwritten") && ! field.equals("pages") && ! field.equals("places")))
          out.print("</system>");
        if (field != null && (field.equals("toc") || field.equals("figures") || field.equals("notes") || field.equals("notesHandwritten") || field.equals("pages") || field.equals("places"))) { 
          String tocXmlStr = tocTransformer.transform(tocStr, field, outputFormat);
          out.print(tocXmlStr);
        }
        out.print("</doc>");
      } else if (mdRecord != null && outputFormat.equals("html")) {
        if (field != null && (field.equals("toc") || field.equals("figures") || field.equals("notes") || field.equals("notesHandwritten") || field.equals("pages") || field.equals("places"))) { 
          DocumentHandler docHandler = new DocumentHandler();
          String docDir = docHandler.getDocDir(docId);
          String tocFileName = docDir + "/toc.xml";
          File tocFile = new File(tocFileName);
          String tocStr = FileUtils.readFileToString(tocFile, "utf-8");
          String tocHtmlStr = tocTransformer.transform(tocStr, field, outputFormat);
          String title = docId + ", " + field;
          String head = "<head><title>" + title + "</title><link rel=\"stylesheet\" type=\"text/css\" href=\"" + cssUrl + "\"/></head>";
          String result = "<html>" + head + "<body>" + tocHtmlStr + "</body>" + "</html>";
          out.print(result);
        }
      } else {
        out.print("<result>" + "no document found with id: " + docId + "</result>");
      }
      out.close();
    } catch (ApplicationException e) {
      throw new ServletException(e);
    }
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }  

  private String getBaseUrl(HttpServletRequest request) {
    return getServerUrl(request) + request.getContextPath();
  }

  private String getServerUrl(HttpServletRequest request) {
    if ( ( request.getServerPort() == 80 ) || ( request.getServerPort() == 443 ) )
      return request.getScheme() + "://" + request.getServerName();
    else
      return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
  }

  private String getTocCount(String tocStr, String type) {
    String tocCount = "0";
    if (tocStr == null)
      return "0";
    String listTypeStr = "<list type=\"" + type + "\" count=\"";
    int from = tocStr.indexOf(listTypeStr);
    if (from != -1) {
      from = from + listTypeStr.length(); 
      int to = tocStr.indexOf("\"", from);
      tocCount = tocStr.substring(from, to);
    }
    return tocCount;
  }
}