Package org.apache.clerezza.tools.offline

Source Code of org.apache.clerezza.tools.offline.ThumbnailCondition

/*
*  Copyright 2010 mir.
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*  under the License.
*/
package org.apache.clerezza.tools.offline;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.clerezza.tools.offline.utils.StreamCondition;
import org.apache.clerezza.platform.content.representations.core.ThumbnailService;
import org.apache.clerezza.rdf.core.UriRef;

/**
*
* @author mir
*/
public class ThumbnailCondition implements StreamCondition {

  private final static byte[] SRC_BYTES = "src=\"".getBytes();
  private final static byte[] HREF_BYTES = "href=\"".getBytes();
  private final static byte QUOTE_BYTE = "\"".getBytes()[0];
  private final static byte[] THUMBNAIL_SERVICE_BYTES = "/thumbnail-service?".getBytes();
  private ThumbnailService thumbnailService;
  private boolean isScr = true;
  private boolean isHref = true;
  private boolean isSatisfied = false;
  private byte[] thumbnailBytes = null;
  private ByteArrayOutputStream cachedQueryParams = new ByteArrayOutputStream();

  private enum Phase {CHECK_TAG_ATTRIBUTE, CHECK_THUMBNAIL_SERVICE, LOOK_FOR_QUOTE};
  private Phase currentPhase = Phase.CHECK_TAG_ATTRIBUTE;
  private int arrayPosition = 0;

  public ThumbnailCondition(ThumbnailService thumbnailService) {
    this.thumbnailService = thumbnailService;
  }

  private void reset() {
    isScr = true;
    isHref = true;
    isSatisfied = false;
    arrayPosition = 0;
    cachedQueryParams.reset();
    thumbnailBytes = null;
    currentPhase = Phase.CHECK_TAG_ATTRIBUTE;
  }

  @Override
  public boolean feed(int b) {
    if (isSatisfied) {
      reset();
    }
    boolean result = false;
    if (currentPhase.equals(Phase.CHECK_TAG_ATTRIBUTE)) {
      result = checkTagAttribute(b);
    } else if (currentPhase.equals(Phase.CHECK_THUMBNAIL_SERVICE)) {
      result = checkThumbnailUri(b);
    } else if (currentPhase.equals(Phase.LOOK_FOR_QUOTE)) {
      result = lookForQuote(b);
    }
    return result;
  }

  private boolean checkTagAttribute(int b) {
    if (isScr) {
      if (SRC_BYTES[arrayPosition] != b) {
        isScr = false;
      } else if (SRC_BYTES.length == arrayPosition + 1) {
        currentPhase = Phase.CHECK_THUMBNAIL_SERVICE;
        arrayPosition = 0;
        return true;
      }
    }
    if (isHref) {
      if (HREF_BYTES[arrayPosition] != b) {
        isHref = false;
      } else if (HREF_BYTES.length == arrayPosition + 1) {
        currentPhase = Phase.CHECK_THUMBNAIL_SERVICE;
        arrayPosition = 0;
        return true;
      }
    }
    if (!isHref && !isScr) {
      reset();
      return false;
    }
    arrayPosition++;
    return true;
  }

  private boolean checkThumbnailUri(int b) {
    if (arrayPosition == 16) {
    }
    if (THUMBNAIL_SERVICE_BYTES[arrayPosition] != b) {
      reset();
      return false;
    } else if (THUMBNAIL_SERVICE_BYTES.length == arrayPosition + 1) {
      currentPhase = Phase.LOOK_FOR_QUOTE;
    }
    arrayPosition++;
    return true;
  }

  private boolean lookForQuote(int b) {
    if (b == QUOTE_BYTE) {
      prepareBytes();
      isSatisfied = true;
      return false;
    } else {
      cachedQueryParams.write(b);
    }
    return true;
  }

  private void prepareBytes() {
    ByteArrayOutputStream bous = new ByteArrayOutputStream();
    try {
      if (isHref) {
        bous.write(HREF_BYTES);
      } else {
        bous.write(SRC_BYTES);
      }
      bous.write(getThumbnailUri());
      bous.write(QUOTE_BYTE);
      thumbnailBytes = bous.toByteArray();
    } catch (IOException ex) {
      throw new RuntimeException(ex);
    }
  }

  private byte[] getThumbnailUri() {
    ThumbnailServiceParams params = parseThumbnailServiceParams();
    UriRef thumbnailUri = thumbnailService.getThumbnailUri(params.getUri(),
        params.getWidth(), params.getHeight(), params.getExact());
    return thumbnailUri.getUnicodeString().getBytes();
  }

  @Override
  public boolean isSatisfied() {
    return isSatisfied;
  }

  @Override
  public byte[] getBytes() {
    return thumbnailBytes;
  }

  private ThumbnailServiceParams parseThumbnailServiceParams() {
    Integer width = null, height = null;
    UriRef uri = null;
    boolean extact = false;
    String queryParams = cachedQueryParams.toString();
    queryParams = queryParams.replace("&", "&");
    String[] nameValues = queryParams.split("&");
    for (String nameValue : nameValues) {
      String[] nameValuePair = nameValue.split("=");
      if (nameValuePair.length == 2) {
        String name = nameValuePair[0];
        if (name.equals("uri")) {
          uri = new UriRef(nameValuePair[1]);
        } else if (name.equals("width")) {
          width = Integer.valueOf(nameValuePair[1]);
        } else if (name.equals("height")) {
          height = Integer.valueOf(nameValuePair[1]);
        } else if (name.equals("exact")) {
          extact = Boolean.valueOf(nameValuePair[1]);
        }
      }
    }
    return new ThumbnailServiceParams(width, height, uri, extact);
  }

  private class ThumbnailServiceParams {
     private Integer width, height;
     private UriRef uri;
     private boolean exact;

    public ThumbnailServiceParams(Integer width, Integer height, UriRef uri,
        boolean exact) {
      this.width = width;
      this.height = height;
      this.uri = uri;
      this.exact = exact;
    }

    public Integer getHeight() {
      return height;
    }

    public UriRef getUri() {
      return uri;
    }

    public Integer getWidth() {
      return width;
    }

    public boolean getExact() {
      return exact;
    }
  }
}
TOP

Related Classes of org.apache.clerezza.tools.offline.ThumbnailCondition

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.