view software/eXist/mpdl-modules/src/de/mpg/mpiwg/berlin/mpdl/externalObjects/app/ExternalObjectsHandler.java @ 6:2396a569e446

new functions: externalObjects, normalizer, Unicode2Betacode
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 08 Feb 2011 14:54:09 +0100
parents
children 1ec29fdd0db8
line wrap: on
line source

package de.mpg.mpiwg.berlin.mpdl.externalObjects.app;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;

import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;

import de.mpg.mpiwg.berlin.mpdl.util.Util;
import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
import de.mpg.mpiwg.berlin.mpdl.externalObjects.db.DbEnvExternalObjects;
import de.mpg.mpiwg.berlin.mpdl.general.MpdlConstants;

public class ExternalObjectsHandler {
  private static ExternalObjectsHandler instance;
  private static String MPDL_DATA_DIR = MpdlConstants.MPDL_EXIST_DATA_DIR;
  private static String DB_DIR_EXTERNAL_OBJECTS = MPDL_DATA_DIR + "/dataBerkeleyDB/externalObjects";
  private DbEnvExternalObjects dbEnvExternalObjects;
  private Date beginOfOperation;
  private Date endOfOperation;
  
  public static ExternalObjectsHandler getInstance() throws ApplicationException {
    if (instance == null) {
      instance = new ExternalObjectsHandler();
      instance.init();
    }
    return instance;
  }

  public ArrayList<ExtElement> readExternalElements(String documentId, String pageNumber) throws ApplicationException {
    return readDBExternalElements(documentId, pageNumber);
  }
  
  public void writeExternalElement(ExtElement element) throws ApplicationException {
    writeDBExternalElement(element);
  }
  
  public void deleteExternalElement(ExtElement element) throws ApplicationException {
    deleteDBExternalElement(element);
  }

  private void writeDBExternalElement(ExtElement element) throws ApplicationException {
    try {
      String keyStr = element.getDocumentId() + "###" + element.getPageNumber();
      String valueStr = element.getXmlString();
      DatabaseEntry dbEntryKey = new DatabaseEntry(keyStr.getBytes("utf-8"));
      DatabaseEntry dbEntryValue = new DatabaseEntry(valueStr.getBytes("utf-8"));
      Database elementDB = dbEnvExternalObjects.getElementDB();
      elementDB.put(null, dbEntryKey, dbEntryValue);
    } catch (DatabaseException e) {
      throw new ApplicationException(e);
    } catch (UnsupportedEncodingException e) {
      throw new ApplicationException(e);
    }
  }

  private void deleteDBExternalElement(ExtElement element) throws ApplicationException {
    try {
      String keyStr = element.getDocumentId() + "###" + element.getPageNumber();
      DatabaseEntry dbEntryKey = new DatabaseEntry(keyStr.getBytes("utf-8"));
      Database elementDB = dbEnvExternalObjects.getElementDB();
      elementDB.delete(null, dbEntryKey);
    } catch (DatabaseException e) {
      throw new ApplicationException(e);
    } catch (UnsupportedEncodingException e) {
      throw new ApplicationException(e);
    }
  }      
      
  private ArrayList<ExtElement> readDBExternalElements(String documentId, String pageNumber) throws ApplicationException {
    ArrayList<ExtElement> retElements = new ArrayList<ExtElement>();
    String hashKey = documentId + "###" + pageNumber;
    try {
      Database elementDB = dbEnvExternalObjects.getElementDB();
      Cursor cursor = elementDB.openCursor(null, null);
      byte[] bHashKey = hashKey.getBytes("utf-8");
      DatabaseEntry dbEntryKey = new DatabaseEntry(bHashKey);
      DatabaseEntry foundValue = new DatabaseEntry();
      OperationStatus operationStatus = cursor.getSearchKey(dbEntryKey, foundValue, LockMode.DEFAULT);
      while (operationStatus == OperationStatus.SUCCESS) {
        byte[] foundValueBytes = foundValue.getData();
        String foundValueStr = new String(foundValueBytes, "utf-8");
        ExtElement e = ExtElement.parseXmlStr(foundValueStr);
        retElements.add(e);
        operationStatus = cursor.getNextDup(dbEntryKey, foundValue, LockMode.DEFAULT);
      }
      cursor.close();
    } catch (DatabaseException e) {
      throw new ApplicationException(e);
    } catch (UnsupportedEncodingException e) {
      throw new ApplicationException(e);
    }
    return retElements;
  }

  private void init() throws ApplicationException {
    dbEnvExternalObjects = new DbEnvExternalObjects();
    dbEnvExternalObjects.setDataDir(DB_DIR_EXTERNAL_OBJECTS);
    dbEnvExternalObjects.init();
    dbEnvExternalObjects.openDatabases();
  }
  
  public static void main(String[] args) throws ApplicationException {
    getInstance();
    instance.beginOperation();
    System.out.print("Start ...");
    // instance.deleteSampleData();
    // instance.writeSampleData();
    instance.readSampleData(); 
    instance.end();
    instance.endOperation();
    Double elapsedTime = new Util().getSecondWithMillisecondsBetween(instance.beginOfOperation, instance.endOfOperation);
    System.out.println("End.");
    System.out.println("Needed time: " + elapsedTime + " seconds");
  }

  private void deleteSampleData() throws ApplicationException {
    ExtElement e = new ExtElement();
    e.setUid("joe");
    e.setDocumentId("/archimedes/it/l223.xml");
    e.setPageNumber("17");
    deleteExternalElement(e);
  }
  
  private void writeSampleData() throws ApplicationException {
    Date now = new Date();

    String sId = "1.2.2.2.2.5";
    ExtElement e = new ExtElement();
    e.setUid("joe");
    e.setModificationDate(now);
    e.setDocumentId("/archimedes/it/l223.xml");
    e.setPageNumber("17");
    e.setXmlNodeId(sId);
    e.setContent("<note>This is a test note to sentence " + sId + "</note>");
    writeExternalElement(e);
    
    ExtElement e2 = new ExtElement();
    String sId2 = "1.2.2.2.2.7";
    e2.setUid("michael");
    e2.setModificationDate(now);
    e2.setDocumentId("/archimedes/it/l223.xml");
    e2.setPageNumber("17");
    e2.setXmlNodeId(sId2);
    e2.setCharPos("18");
    e2.setContent("<note>This is a test note to sentence " + sId2 + "</note>");
    writeExternalElement(e2);
    
    /*
    String sId3 = "1.2.2.2.2.8.15.3.3";
    e3.setUid("joe");
    e3.setModificationDate(now);
    e3.setDocumentId("/archimedes/it/l223.xml");
    e3.setPageNumber("17");
    e3.setXmlNodeId(sId3);
    e2.setContent("<note>This is an external test note to sentence " + sId3 + "</note>");
    writeExternalElement(e3);
     */
    
  }

  private void readSampleData() throws ApplicationException {
    ArrayList<ExtElement> elements = readExternalElements("/archimedes/it/l223.xml", "17"); 
    System.out.println(elements);
  }
  
  private void end() throws ApplicationException {
    dbEnvExternalObjects.close();
  }

  private void beginOperation() {
    beginOfOperation = new Date();
  }

  private void endOperation() {
    endOfOperation = new Date();
  }

}