/*
 * Copyright 2012 NGDATA nv
 *
 * 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.
 */
package org.lilyproject.rest;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;

import org.lilyproject.repository.api.Record;
import org.lilyproject.repository.api.RecordScanner;
import org.lilyproject.repository.api.RepositoryException;
import org.springframework.beans.factory.annotation.Autowired;

import com.google.common.cache.Cache;

@Path("scan/{id}")
public class RecordScanResource extends RepositoryEnabled {
    @Autowired
    private Cache<String, RecordScanner> recordScannerMap;
    
    @GET
    @Produces("application/json")
    public EntityList<Record> get(@PathParam("id") String scanId, @DefaultValue("1") @QueryParam("batch") Long batch, @Context UriInfo uriInfo) {
        RecordScanner scanner = recordScannerMap.getIfPresent(scanId);
        if (scanner != null) {           
            List<Record> records = new ArrayList<Record>();
            
            try {                
                Record record;            
                while(records.size() < batch && (record = scanner.next()) != null) {
                    records.add(record);
                }
            } catch (RepositoryException e) {
                throw new ResourceException(e, Status.INTERNAL_SERVER_ERROR.getStatusCode());
            } catch (InterruptedException e) {
                throw new ResourceException(e, Status.INTERNAL_SERVER_ERROR.getStatusCode());
            }
            
            if (records.size() < 1) {
                throw new ResourceException("No more records found in scanner " + scanId, Status.NO_CONTENT.getStatusCode());
            }
            
            return EntityList.create(records, uriInfo);
        } else {
            throw new ResourceException("No scan with ID " + scanId + " found", Status.NOT_FOUND.getStatusCode());
        }
    }
    
    @DELETE
    public Response delete(@PathParam("id") String scanId) {
        RecordScanner scanner = this.recordScannerMap.getIfPresent(scanId);
        if (scanner != null) {            
            scanner.close();  
            this.recordScannerMap.invalidate(scanId);
            return Response.ok().build();
        } else {
            throw new ResourceException("No scan with ID " + scanId + " found", Status.NOT_FOUND.getStatusCode());        
        }
    }
}

@@ -864,24 +864,68 @@
 QueryParam;%0A
+import javax.ws.rs.WebApplicationException;%0A
 import javax
@@ -1355,16 +1355,67 @@
 Cache;%0A%0A
+import static javax.ws.rs.core.Response.Status.*;%0A%0A
 @Path(%22s
@@ -2245,39 +2245,32 @@
 rceException(e, 
-Status.
 INTERNAL_SERVER_
@@ -2387,23 +2387,16 @@
 tion(e, 
-Status.
 INTERNAL
@@ -2522,79 +2522,48 @@
 new 
-ResourceException(%22No more records found in scanner %22 + scanId, S
+WebApplicationException(Response.s
 tatus
-.
+(
 NO_C
@@ -2568,30 +2568,23 @@
 _CONTENT
-.getStatusCode
+).build
 ());%0A   
@@ -2752,39 +2752,32 @@
 nId + %22 found%22, 
-Status.
 NOT_FOUND.getSta
@@ -3225,23 +3225,16 @@
 found%22, 
-Status.
 NOT_FOUN
@@ -3252,24 +3252,16 @@
 Code());
-        
 %0A       

Fix response status code when scanner is exhausted