/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.rest;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;
import org.geoserver.importer.*;
import org.geoserver.importer.rest.converters.ImportJSONWriter;
import org.geoserver.rest.RestBaseController;
import org.geoserver.rest.RestException;
import org.geoserver.rest.util.MediaTypeExtensions;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.NoSuchElementException;
@RestController
@ControllerAdvice
@RequestMapping(path = RestBaseController.ROOT_PATH + "/imports/{importId}", produces = {
MediaType.APPLICATION_JSON_VALUE,
MediaTypeExtensions.TEXT_JSON_VALUE})
public class ImportDataController extends ImportBaseController {
public ImportDataController(Importer importer) {
super(importer);
}
protected ImportJSONWriter converterWriter;
@GetMapping(value = { "/data", "/tasks/{taskId}/data", })
public ImportData getData(
@PathVariable Long importId,
@PathVariable(required = false) Integer taskId) throws Exception {
ImportData data = null;
ImportTask task = task(importId, taskId, true);
if (task != null) {
data = task.getData();
data.setParent(task);
} else {
final ImportContext context = context(importId);
data = context.getData();
data.setParent(context);
}
return data;
}
//We need to force spring to ignore the .shp here (we don't want a .shp encoded response!
@GetMapping(value = {
"/data/files", "/tasks/{taskId}/data/files",
"/data/files/{fileName:.+}", "/tasks/{taskId}/data/files/{fileName:\\.+}" })
public ImportData getDirectory(
@PathVariable Long importId,
@PathVariable(required = false) Integer taskId,
@PathVariable(required = false) String fileName) throws Exception {
return getDataImport(importId, fileName);
}
//We need to force spring to ignore the .shp here (we don't want a .shp encoded response!
@DeleteMapping(value = {"/data/files/{fileName:.+}", "/tasks/{taskId}/data/files/{fileName:\\.+}" })
public ResponseEntity deleteDirectory(
@PathVariable Long importId,
@PathVariable(required = false) Integer taskId,
@PathVariable(required = false) String fileName) throws Exception {
Directory dir = lookupDirectory(importId);
ImportData file = lookupFile(fileName, dir);
if (dir.getFiles().remove(file)) {
return new ResponseEntity("", new HttpHeaders(), HttpStatus.NO_CONTENT);
} else {
throw new RestException("Unable to remove file: " + file.getName(), HttpStatus.BAD_REQUEST);
}
}
private ImportData getDataImport(Long importId, String fileName) {
Directory dir = lookupDirectory(importId);
ImportData response = dir;
if (fileName != null) {
response = lookupFile(fileName, dir);
response.setParent((ImportContext) dir.getParent());
}
return (ImportData) response;
}
Directory lookupDirectory(Long importId) {
ImportContext context = context(importId);
if (!(context.getData() instanceof Directory)) {
throw new RestException("Data is not a directory", HttpStatus.BAD_REQUEST);
}
Directory data = (Directory) context.getData();
data.setParent(context);
return data;
}
public ImportData lookupFile(String file, Directory dir) {
try {
if (file != null) {
return Iterators.find(dir.getFiles().iterator(), new Predicate<FileData>() {
@Override
public boolean apply(FileData input) {
return input.getFile().getName().equals(file);
}
});
}
} catch (NoSuchElementException e) {
}
throw new RestException("No such file: " + file, HttpStatus.NOT_FOUND);
}
}