/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

package org.apache.tajo.pullserver.retriever;

import org.apache.tajo.pullserver.FileAccessForbiddenException;
import org.apache.tajo.pullserver.HttpDataServerHandler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.HttpRequest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class DirectoryRetriever implements DataRetriever {
  public String baseDir;
  
  public DirectoryRetriever(String baseDir) {
    this.baseDir = baseDir;
  }

  @Override
  public FileChunk [] handle(ChannelHandlerContext ctx, HttpRequest request)
      throws IOException {
    final String path = HttpDataServerHandler.sanitizeUri(request.getUri());
    if (path == null) {
      throw new IllegalArgumentException("Wrong uri: " +request.getUri());
    }

    File file = new File(baseDir, path);
    if (file.isHidden() || !file.exists()) {
      throw new FileNotFoundException("No such file: " + baseDir + "/" + path);
    }
    if (!file.isFile()) {
      throw new FileAccessForbiddenException("No such file: "
          + baseDir + "/" + path); 
    }
    
    return new FileChunk[] {new FileChunk(file, 0, file.length())};
  }
}
