view software/eXist/mpdl-modules/src/de/mpg/mpiwg/berlin/mpdl/escidoc/TestESciDoc.java @ 0:408254cf2f1d

Erstellung
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Wed, 24 Nov 2010 17:24:23 +0100
parents
children 2396a569e446
line wrap: on
line source

package de.mpg.mpiwg.berlin.mpdl.escidoc;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.quartz.impl.StdSchedulerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
import de.mpg.mpiwg.berlin.mpdl.general.MpdlConstants;
import de.mpg.mpiwg.berlin.mpdl.schedule.MpdlChainScheduler;
import de.mpg.mpiwg.berlin.mpdl.util.XmlUtil;


public class TestESciDoc {
  private String cookieId;
  private ESciDocRestSession eSciDocRestSession;
  private String organizationalUnit = MpdlConstants.MPDL_ESCIDOC_OUM_ID;
  private String fullContextId = MpdlConstants.MPDL_ESCIDOC_CONTEXT_ID;
  private String archimedesContainerId = MpdlConstants.MPDL_ESCIDOC_ARCHIMEDES_CONTAINER_ID;
  private String echoContainerId = MpdlConstants.MPDL_ESCIDOC_ECHO_CONTAINER_ID;

  public static void main(String[] args) {
    try {
      /*
      byte[] ligatureBytes = new byte[5];
      ligatureBytes[0] = (byte) Integer.parseInt("61", 16);
      ligatureBytes[1] = (byte) Integer.parseInt("74", 16);
      ligatureBytes[2] = (byte) Integer.parseInt("EE", 16);
      ligatureBytes[3] = (byte) Integer.parseInt("A2", 16);
      ligatureBytes[4] = (byte) Integer.parseInt("BF", 16);
      
      String ligature = new String(ligatureBytes, "utf-8");
      char[] chars = new char[3];
      chars[0] = ligature.charAt(0);
      chars[1] = ligature.charAt(1);
      chars[2] = ligature.charAt(2);
      int codepoint = Character.codePointAt(chars, 2);
      int num = Character.getNumericValue(ligature.charAt(2));
      int type = Character.getType(ligature.charAt(2));
      */
      
      TestESciDoc test = new TestESciDoc();
      test.init("jwillenborg");  // init eSciDoc-Session with cookie as user jwillenborg
      
      // test.grant("aeisemann", "admin");
      String uid = test.getUserId("aeisemann");
      String users = test.getAllUsers();
      String grantAdmin = test.getGrantHrefByUserNameAndRoleName("aeisemann", "escidoc:role-system-administrator");
      String grants = test.getGrantsByUserName("aeisemann");
      String bla = "";

      // test.testSchemaValidation();

      // test.deleteItem("/ir/item/escidoc:48488");
      // test.deleteContainer("/ir/container/escidoc:48486");
      /*
      String containerId = test.createContainer("testJoey1");
      System.out.println("Begin: " + (new Date()).getTime());
      Date successDate = test.addMembersToContainer("/ir/container/escidoc:41646");
      System.out.println("End: " + (new Date()).getTime());
      */

      // String contextId = test.createContext(test.organizationalUnit, "MPDL-XML-Test", "MPDL-XML-Test", "MpdlType");
      // test.openContext("escidoc:38600");

      // String containerId = test.createContainer("eXistArchimedesContainer");
      // System.out.println(containerId);
      // String containerId = test.createContainer("eXistEchoContainer");

      /*
      for (int i=0; i< 443; i++) {
        MetadataRecord mdRecordImage = new MetadataRecord();
        mdRecordImage.setIdentifier("file_" + i);
        mdRecordImage.setTitle("ECHO scanned page: " + i);
        String fileName = "000" + i;
        String srcUrl = "http://echo.mpiwg-berlin.mpg.de/zogilib?fn=/permanent/library/" + "163127KK" + "/pageimg/" + fileName;  // TODO
        String itemId = test.createItem("mpiwg:47114711", mdRecordImage, fileName, "image/jpeg", "JPEG_DEFAULT", "external-url", srcUrl);
        System.out.println(i + ". " + itemId + " created");
      }
      */
      /*
      String srcUrlAlvarus = "http://mpdl-proto.mpiwg-berlin.mpg.de/exist/rest/db/mpdl/documents/standard/echo/la/alvarus_1509_lat_V40_10.xml";
      Date pubYearAlvarus = XmlUtil.getInstance().toDate("1509-01-01T00:00:00.000Z");
      MetadataRecord mdAlvarus = new MetadataRecord("/echo/la/alvarus_1509_lat_V40_10.xml", "la", "Alvarus, Thomas", "Liber de triplici motu proportionibus annexis magiſtri Aluari Thome Ulixboneñ philoſophicas Suiſeth calculationes ex parte declarans", null, null, "text/xml", pubYearAlvarus);
      String result = test.createItemInContainer(test.echoContainerId, mdAlvarus.getIdentifier(), mdAlvarus, srcUrlAlvarus);
      
      String srcUrlBenedetti = "http://mpdl-proto.mpiwg-berlin.mpg.de/exist/rest/db/mpdl/documents/standard/echo/la/Benedetti_1585.xml";
      Date pubYearBenedetti = XmlUtil.getInstance().toDate("1585-01-01T00:00:00.000Z");
      MetadataRecord mdBenedetti = new MetadataRecord("/echo/la/Benedetti_1585.xml", "la", "Benedetti, Giovanni Battista de", "Diversarum Speculationum mathematicum, & physicarum liber", null, null, "text/xml", pubYearBenedetti);
      String result = test.createItemInContainer(test.echoContainerId, mdBenedetti.getIdentifier(), mdBenedetti, srcUrlBenedetti);
      
      String srcUrlEuclid = "http://mpdl-proto.mpiwg-berlin.mpg.de/exist/rest/db/mpdl/documents/standard/echo/el/Euclid-300.xml";
      Date pubYearEuclid = XmlUtil.getInstance().toDate("0300-01-01T00:00:00.000Z");
      MetadataRecord mdEuclid = new MetadataRecord("/echo/el/Euclid-300.xml", "el", "Euclid", "Στοιχεῖα", null, null, "text/xml", pubYearEuclid);
      String result = test.createItemInContainer(test.echoContainerId, mdEuclid.getIdentifier(), mdEuclid, srcUrlEuclid);
      
      String srcUrlEuclid2 = "http://mpdl-proto.mpiwg-berlin.mpg.de/exist/rest/db/mpdl/documents/standard/echo/zh/Euclid_1966_V8.xml";
      Date pubYearEuclid2 = XmlUtil.getInstance().toDate("0300-01-01T00:00:00.000Z");
      MetadataRecord mdEuclid2 = new MetadataRecord("/echo/zh/Euclid_1966_V8.xml", "zh", "Euclid", "Jihe yuanben, 幾何原本", null, null, "text/xml", pubYearEuclid2);
      String result = test.createItemInContainer(test.echoContainerId, mdEuclid2.getIdentifier(), mdEuclid2, "/echo/zh/Euclid_1966_V8.xml", "text/xml", "any fulltext", "internal-managed", srcUrlEuclid2);
      
      String items = test.getItemsByContainerIdAndFilter(test.echoContainerId, null);
      */
      
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void init(String userName) throws ApplicationException {
    Scanner in = new Scanner(System.in);
    System.out.print("Username: " + userName + ", Password: ");
    String password = in.nextLine();
    in.close();
    cookieId = ESciDocRestSession.login(userName, password);
    eSciDocRestSession = ESciDocRestSession.getInstance(cookieId);
    fullContextId = MpdlConstants.MPDL_ESCIDOC_CONTEXT_ID;
  }

  private void testSchemaValidation() throws ApplicationException {
    String[] rncSchemaFiles = {
        "echo/echo.rnc",
        "echo/modules/echo-datatype.rnc", "echo/modules/echo-handwritten.rnc", "echo/modules/echo-start.rnc", 
        "echo/modules/echo-attribute.rnc", "echo/modules/echo-de.rnc", "echo/modules/echo-import-mathml.rnc", "echo/modules/echo-text.rnc", 
        "echo/modules/echo-block-scholarly.rnc", "echo/modules/echo-div.rnc", "echo/modules/echo-import-xhtml.rnc", "echo/modules/echo-textflows.rnc", 
        "echo/modules/echo-block.rnc", "echo/modules/echo-figure.rnc", "echo/modules/echo-mathematics.rnc",  
        "echo/modules/echo-chinese-text.rnc", "echo/modules/echo-float.rnc", "echo/modules/echo-metadata.rnc", 
        "echo/modules/echo-content-scholarly.rnc", "echo/modules/echo-gap.rnc", "echo/modules/echo-milestone.rnc", 
        "echo/modules/echo-content.rnc", "echo/modules/echo-gis.rnc", "echo/modules/echo-note.rnc", 
        "xhtml/xhtml-datatypes.rnc", "xhtml/xhtml-list.rnc", "xhtml/xhtml-attribs.rnc", "xhtml/xhtml-basic-table.rnc"
        };
    String[] schemas = {
        "echo-schema/dcterms.xsd", "echo-schema/echo-datatype.xsd", "echo-schema/echo-handwritten.xsd", "echo-schema/echo-start.xsd", "echo-schema/xhtml-datatypes.xsd",
        "echo-schema/echo-attribute.xsd", "echo-schema/echo-de.xsd", "echo-schema/ echo-import-mathml.xsd", "echo-schema/echo-text.xsd", "echo-schema/xhtml-list.xsd",
        "echo-schema/echo-block-scholarly.xsd", "echo-schema/echo-div.xsd", "echo-schema/echo-import-xhtml.xsd", "echo-schema/echo-textflows.xsd", "echo-schema/xlink.xsd",
        "echo-schema/echo-block.xsd", "echo-schema/echo-figure.xsd", "echo-schema/echo-mathematics.xsd", "echo-schema/echo.xsd", "echo-schema/xml.xsd",
        "echo-schema/echo-chinese-text.xsd", "echo-schema/echo-float.xsd", "echo-schema/  echo-metadata.xsd", "echo-schema/local.xsd", "echo-schema/xsi.xsd",
        "echo-schema/echo-content-scholarly.xsd", "echo-schema/echo-gap.xsd", "echo-schema/echo-milestone.xsd", "echo-schema/xhtml-attribs.xsd",
        "echo-schema/echo-content.xsd", "echo-schema/echo-gis.xsd", "echo-schema/echo-note.xsd", "echo-schema/xhtml-basic-table.xsd"
        };
    File xmlFile = new File("/Users/jwillenborg/texts/echo/SongYingxing_1637.xml");
    // validate(xmlFile, schemas);
    validateByRelaxNG(xmlFile, rncSchemaFiles);
  }
  
  private void validateDocumentBuilder(File xmlFile, String[] schemaFileNames) throws ApplicationException {
    String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
    String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; 
    String W3C_XML_SCHEMA = XMLConstants.W3C_XML_SCHEMA_NS_URI; 
    Node root = null;
    try {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setNamespaceAware(true);
      dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); 
      dbf.setAttribute(JAXP_SCHEMA_SOURCE, schemaFileNames);
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document doc = db.parse(xmlFile);   
      root = doc.getFirstChild();
      String bla = "";
    } catch (Exception e) {
      throw new ApplicationException(e);
    }
  }
  
  public void validateByRelaxNG(File xmlFile, String[] schemaFileNames) throws ApplicationException {
    // System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory");
    System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
    // RELAX NG factory
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
    // Compile the schema.
    Schema schema = null;
    try {
      URL schemaUrl = new URL("http://mpdl-test.mpiwg-berlin.mpg.de:30030/exist/rest/db/mpdl/schema/echo/echo.rnc");
      schema = factory.newSchema(schemaUrl);
    } catch (SAXException e) {
      throw new ApplicationException(e);
    } catch (MalformedURLException e) {
      throw new ApplicationException(e);
    }
    // Get a validator from the schema.
    Validator validator = schema.newValidator();
    // Check the document 
    InputSource inputSource = new InputSource(xmlFile.getPath());
    Source source = new SAXSource(inputSource); 
    try {
      validator.validate(source);
    } catch (SAXException e) {
      throw new ApplicationException(e);
    } catch (IOException e) {
      throw new ApplicationException(e);
    }    
  }
  
  private void validate(File xmlFile, String[] schemaFileNames) throws ApplicationException {
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    // Compile the schema.
    Schema schema = null;
    Source[] schemaInputSources = new SAXSource[schemaFileNames.length];
    for (int i=0; i<schemaFileNames.length; i++) {
      String schemaFileName = "mpdl/extensions/mpdl-modules/src/de/mpg/mpiwg/berlin/mpdl/escidoc/" + schemaFileNames[i];
      InputSource inputSource = new InputSource(schemaFileName);
      Source source = new SAXSource(inputSource); 
      schemaInputSources[i] = source;
    }
    try {
      schema = factory.newSchema(schemaInputSources);
    } catch (SAXException e) {
      throw new ApplicationException(e);
    }
    // Get a validator from the schema.
    Validator validator = schema.newValidator();
    // Check the document 
    InputSource inputSource = new InputSource(xmlFile.getPath());
    Source source = new SAXSource(inputSource); 
    // DOMSource source = new DOMSource(docNode);  // TODO evtl. nur per Node aufrufen 
    try {
      validator.validate(source);
    } catch (SAXException e) {
      throw new ApplicationException(e);
    } catch (IOException e) {
      throw new ApplicationException(e);
    }    
  }
  
  private String getUserId(String userName) throws ApplicationException {
    String userId = eSciDocRestSession.getUserId(userName);
    return userId;
  }
  
  private String getAllUsers() throws ApplicationException {
    String users = eSciDocRestSession.getAllUsers();
    return users;
  }
  
  private String getGrantsByUserName(String userName) throws ApplicationException {
    String grant = eSciDocRestSession.getGrantsByUserName(userName);
    return grant;
  }
  
  private String getGrantHrefByUserNameAndRoleName(String userName, String roleName) throws ApplicationException {
    String grant = eSciDocRestSession.getGrantHrefByUserNameAndRoleName(userName, roleName);
    return grant;
  }
  
  private void grant(String userId, String role) throws ApplicationException {
    eSciDocRestSession.grant(userId, role);
  }
  
  private String createContext(String organizationalUnit, String name, String description, String type) throws ApplicationException {
    fullContextId = eSciDocRestSession.createContext(organizationalUnit, name, description, type);
    return fullContextId;
  }
  
  private void openContext(String contextId) throws ApplicationException {
    eSciDocRestSession.openContext(contextId);
  }

  private String createContainer(String containerName) throws ApplicationException {
    MetadataRecord mdContainerEcho = new MetadataRecord(containerName, null, null, null, null, null, null, null, null);
    String containerId = eSciDocRestSession.createContainer(containerName, mdContainerEcho);
    // String nextContainerId = eSciDocRestSession.createContainerInContainer(containerName, mdContainerEcho, "/ir/container/escidoc:25163");
    // String bla = eSciDocRestSession.createItemInContainer("bla", mdContainerEcho, "bla.xml", "text/xml", "any fulltext", "internal-managed", "/ir/container/escidoc:25164", "http://test.com");
    String pageImageUrl = "http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler?fn=/permanent/archimedes/monte_mecha_037_it_1581/037-01-pageimg&amp;pn=1&amp;dh=600";  // TODO
    // String pageItemId = eSciDocRestSession.createItemInContainer(containerId, "bla", mdContainerEcho, "/permanent/archimedes/monte_mecha_037_it_1581", "image/jpeg", "JPEG_DEFAULT", "external-url", pageImageUrl);  // TODO
    // pageItemId = eSciDocRestSession.createItemInContainer("/ir/container/escidoc:25164", "bla", mdContainerEcho, "/permanent/archimedes/monte_mecha_037_it_1581", "image/jpeg", "JPEG_DEFAULT", "external-url", pageImageUrl);  // TODO
    // pageItemId = eSciDocRestSession.createItemInContainer("/ir/container/escidoc:25164", "bla", mdContainerEcho, "/permanent/archimedes/monte_mecha_037_it_1581", "image/jpeg", "JPEG_DEFAULT", "external-url", pageImageUrl);  // TODO
    return containerId;
  }

  private Item createItemInContainer(String containerId, String pid, MetadataRecord mdRecord, ArrayList<Component> components) throws ApplicationException {
    Item result = eSciDocRestSession.createItemInContainer(containerId, pid, mdRecord, components);
    return result;
  }
  
  private Item createItem(String pid, MetadataRecord mdRecord, ArrayList<Component> components) throws ApplicationException {
    Item result = eSciDocRestSession.createItem(pid, mdRecord, components);
    return result;
  }
  
  private Date addMembersToContainer(String containerId) throws ApplicationException {
    String modDateStr = "2010-04-16T15:00:53.409Z";
    Date modDate = XmlUtil.getInstance().toDate(modDateStr);
    ArrayList<String> memberIds = new ArrayList<String>();
    for (int i=40761; i<= 41645; i = i + 2) {
      String memberId = "" + i;
      memberIds.add(memberId);
    }
    Date result = eSciDocRestSession.addMembers(containerId, modDate, memberIds);
    return result;
  }
  
  private String getItemsByContainerIdAndFilter(String containerId, String filter) throws ApplicationException {
    String members = eSciDocRestSession.getMembersByContainerIdAndFilter(containerId, filter);
    return members;
  }

  private void deleteContainer(String containerId) throws ApplicationException {
    eSciDocRestSession.deleteContainer(containerId);
  }

  private void deleteItem(String itemId) throws ApplicationException {
    eSciDocRestSession.deleteItem(itemId);
  }

  private void test() {
    /*
    XmlUtil xmlUtil = XmlUtil.getInstance();
    ClientSession eSciDocClientSession = new ClientSession("http", "xserve07.mpiwg-berlin.mpg.de", 8080, "jwillenborg", "pucki123");
    String contextId = "/ir/context/escidoc:23002";
    String filterDetail = "<filter></filter><order-by sorting=\"ascending\">/id</order-by>";
    String filter = "<param>" + filterDetail + "</param>";
    String members = eSciDocClientSession.getItemsByContainerIdAndFilter("escidoc:23003", filter);
    System.out.println(members);

    String item = eSciDocClientSession.getItem("escidoc:13003");
    String itemId = xmlUtil.getFirstElementAttributeValue(item, "prop:latest-version", "xlink:href");
    System.out.println(itemId);
    /*
    Date pubYearAlvarus = xmlUtil.toDate("1509-01-01T00:00:00.000Z");
    MetadataRecord mdAlvarus = new MetadataRecord("/archimedes/la/alvarus_1509_lat_V40_10.xml", "la", "Alvarus, Thomas", "Liber de triplici motu proportionibus annexis magiſtri Aluari Thome Ulixboneñ philoſophicas Suiſeth calculationes ex parte declarans", null, null, "text/xml", pubYearAlvarus);
    String srcUrlAlvarus = "http://mpdl-proto.mpiwg-berlin.mpg.de/exist/rest/db/mpdl/documents/standard/echo/la/alvarus_1509_lat_V40_10.xml";
    String result = eSciDocClientSession.createItemInContainer(contextId, "MPDL-XML-Test", "abcdefg", mdAlvarus, "escidoc:23003", srcUrlAlvarus);
    */

    /*
    Date pubYearAgricola = xmlUtil.toDate("1912-01-01T00:00:00.000Z");
    MetadataRecord mdAgricola = new MetadataRecord("/archimedes/en/agric_remet_002_en.xml", "la", "Agricola, Georgius", "De re metallica", null, "London", "text/xml", pubYearAgricola);
    String srcUrlAgricola = "http://mpdl-proto.mpiwg-berlin.mpg.de/exist/rest/db/mpdl/documents/standard/archimedes/en/agric_remet_002_en.xml";
    String item = eSciDocClientSession.getItemById("escidoc:23012");
    String lastVersionDateStr = xmlUtil.getFirstElementValue(item, "version:date");
    Date lastModificationDate = xmlUtil.toDate(lastVersionDateStr);
    String lastModificationDateStr = xmlUtil.toXsDate(lastModificationDate);
    String itemXmlResult = eSciDocClientSession.updateItem(contextId, "MPDL-XML-Test", "abcdefg", mdAgricola, srcUrlAgricola, "escidoc:23012", lastModificationDate);
    */
    /*
    String itemIdAgricola = xmlUtil.getFirstElementAttributeValue(itemXmlResult, "prop:latest-version", "xlink:href");
    eSciDocClientSession.deleteItem(contextId, "escidoc:23010");
    */
    /*
    String containerName = "testEXistEcho";
    MetadataRecord mdRecord = new MetadataRecord("testEXistArchimedes", "Echo document container");
    String containerXmlResult = eSciDocClientSession.addContainer("/ir/context/escidoc:23002", "MPDL-XML-Test", containerPid, mdRecord);
    String containerId = xmlUtil.getFirstElementAttributeValue(containerXmlResult, "prop:latest-version", "xlink:href");
    System.out.println(containerId);
    */
    // eSciDocClientSession.deleteItem(contextId, "escidoc:23012");
  }
}