Package com.bhle.access.download.generator

Source Code of com.bhle.access.download.generator.PageIndexParser

package com.bhle.access.download.generator;

import java.net.URI;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.bhle.access.util.FedoraURI;

public class PageIndexParser {

  private static final Logger logger = LoggerFactory
      .getLogger(PageIndexParser.class);

  private static String INDEX_REGEX = "\\d+|\\d+-\\d+|n\\d+|n\\d+-n\\d+";

  private static DecimalFormat PAGE_INDEX_FORMATTER = new DecimalFormat(
      "00000");

  public static String[] parse(String range, String[] pageUris) {
    List<String> result = new ArrayList<String>();

    if (range.contains("-")) {

      logger.debug("Parge Index Range: " + range);

      String[] limits = range.split("-");
      String lowerBound = limits[0];
      String higherBound = limits[1];

      int lowPageIndex = getPageIndex(lowerBound);
      String lowerSerialNumber = PAGE_INDEX_FORMATTER
          .format(lowPageIndex);

      int highPageIndex = getPageIndex(higherBound);
      String higherSerialNumber = PAGE_INDEX_FORMATTER
          .format(highPageIndex);

      String smallestSerialNumber = getFirstSerialNumber(pageUris);
      String biggestSerialNumber = getLastSerialNumber(pageUris);

      int from = lowerSerialNumber.compareTo(smallestSerialNumber) < 0 ? 0
          : Integer.MAX_VALUE;
      int to = higherSerialNumber.compareTo(biggestSerialNumber) > 0 ? pageUris.length - 1
          : Integer.MIN_VALUE;

      for (int i = 0; i < pageUris.length; i++) {
        FedoraURI fedoraUri = new FedoraURI(URI.create(pageUris[i]));
        logger.debug(fedoraUri.getSerialNumber());
        if (lowerSerialNumber.equals(fedoraUri.getSerialNumber())) {
          from = i;
        }

        if (higherSerialNumber.equals(fedoraUri.getSerialNumber())) {
          to = i;
        }
      }

      logger.debug("from: {} to {}", from, to);

      return Arrays.copyOfRange(pageUris, from, to + 1);
    } else {

      logger.debug("Parge Single Index: " + range);

      int pageIndex = getPageIndex(range);
      String serialNumber = PAGE_INDEX_FORMATTER.format(pageIndex);

      for (String pageUri : pageUris) {
        FedoraURI fedoraUri = new FedoraURI(URI.create(pageUri));
        if (serialNumber.equals(fedoraUri.getSerialNumber())) {
          result.add(pageUri);
          break;
        }
      }
    }
    return result.toArray(new String[result.size()]);
  }

  private static int getPageIndex(String range) {
    if (range.startsWith("n")) {
      throw new IllegalArgumentException("Not implemented yet");
    } else {
      // BookReader starts from 0, while page serial number starts from 0
      return Integer.valueOf(range) + 1;
    }
  }

  private static String getFirstSerialNumber(String[] pageUris) {
    FedoraURI fedoraUri = new FedoraURI(URI.create(pageUris[0]));
    return fedoraUri.getSerialNumber();
  }

  private static String getLastSerialNumber(String[] pageUris) {
    FedoraURI fedoraUri = new FedoraURI(
        URI.create(pageUris[pageUris.length - 1]));
    return fedoraUri.getSerialNumber();
  }

  public static boolean isValid(String range) {
    return Pattern.matches(INDEX_REGEX, range);
  }

}
TOP

Related Classes of com.bhle.access.download.generator.PageIndexParser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.