package org.limewire.rest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.protocol.HttpContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.limewire.core.api.library.LibraryFileList;
import org.limewire.core.api.library.LibraryManager;
import org.limewire.core.api.library.LocalFileItem;
import com.google.inject.Inject;
/**
* Request handler for Library services.
*/
class LibraryRequestHandler extends AbstractRestRequestHandler {
private static final String METADATA = "";
private static final String FILES = "/files";
private static final int MAX_LIMIT = 50;
private final LibraryManager libraryManager;
@Inject
public LibraryRequestHandler(LibraryManager libraryManager) {
this.libraryManager = libraryManager;
}
@Override
public void handle(HttpRequest request, HttpResponse response, HttpContext context)
throws HttpException, IOException {
String method = request.getRequestLine().getMethod();
if (RestUtils.GET.equals(method)) {
// Get uri target.
String uriTarget = RestUtils.getUriTarget(request, RestPrefix.LIBRARY.pattern());
// Get query parameters.
Map<String, String> queryParams = RestUtils.getQueryParams(request);
// Set response.
process(uriTarget, queryParams, response);
} else {
response.setStatusCode(HttpStatus.SC_NOT_IMPLEMENTED);
}
}
/**
* Processes the specified uri target and query parameters.
*/
private void process(String uriTarget, Map<String, String> queryParams, HttpResponse response)
throws IOException {
if (METADATA.equals(uriTarget)) {
// Get library files.
LibraryFileList fileList = libraryManager.getLibraryManagedList();
try {
// Create JSON result.
JSONObject jsonObj = RestUtils.createLibraryJson(fileList);
// Set response entity and status.
HttpEntity entity = RestUtils.createStringEntity(jsonObj.toString());
response.setEntity(entity);
response.setStatusCode(HttpStatus.SC_OK);
} catch (JSONException ex) {
throw new IOException(ex);
}
} else if (FILES.equals(uriTarget)) {
// Get library files.
LibraryFileList fileList = libraryManager.getLibraryManagedList();
List<LocalFileItem> fileItemList = new ArrayList<LocalFileItem>(fileList.getModel());
// Get query parameters.
String offsetStr = queryParams.get("offset");
String limitStr = queryParams.get("limit");
int offset = (offsetStr != null) ? Integer.parseInt(offsetStr) : 0;
int limit = (limitStr != null) ? Math.min(Integer.parseInt(limitStr), MAX_LIMIT) : MAX_LIMIT;
try {
// Create JSON result with requested files.
JSONArray jsonArr = new JSONArray();
for (int i = offset, max = Math.min(offset + limit, fileItemList.size()); i < max; i++) {
LocalFileItem fileItem = fileItemList.get(i);
jsonArr.put(RestUtils.createFileItemJson(fileItem));
}
// Set response entity and status.
HttpEntity entity = RestUtils.createStringEntity(jsonArr.toString());
response.setEntity(entity);
response.setStatusCode(HttpStatus.SC_OK);
} catch (JSONException ex) {
throw new IOException(ex);
}
} else {
response.setStatusCode(HttpStatus.SC_NOT_IMPLEMENTED);
}
}
}