/* (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 freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import org.apache.commons.lang.NotImplementedException;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.Importer;
import org.geoserver.importer.transform.ImportTransform;
import org.geoserver.ows.util.OwsUtils;
import org.geoserver.rest.RestBaseController;
import org.geoserver.rest.converters.FreemarkerHTMLMessageConverter;
import org.geoserver.rest.util.MediaTypeExtensions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;
import java.lang.reflect.Type;
@RestController
@ControllerAdvice
@RequestMapping(path = RestBaseController.ROOT_PATH + "/imports/{importId}", produces = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.TEXT_HTML_VALUE })
public class ImportTransformController extends ImportBaseController {
@Autowired
protected ImportTransformController(Importer importer) {
super(importer);
}
@PostMapping(path = { "/tasks/{taskId}/transforms" })
public ResponseEntity postTransform(
@PathVariable Long importId,
@PathVariable Integer taskId,
@RequestParam(value = "expand", required = false) String expand,
@RequestBody ImportTransform importTransform,
UriComponentsBuilder builder) {
ImportTransform tx = importTransform;
ImportTask task = task(importId, taskId);
task.getTransform().add(tx);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(
builder.path("/imports/{importId}/tasks/{taskId}/transforms/{transformId}")
.buildAndExpand(importId.toString(), taskId.toString(),
task.getTransform().getTransforms().size() - 1)
.toUri());
return new ResponseEntity<String>("", headers, HttpStatus.CREATED);
}
@GetMapping(path = {"/tasks/{taskId}/transforms", "/tasks/{taskId}/transforms/{transformId}" })
public ImportWrapper getTransform(
@PathVariable Long importId,
@PathVariable Integer taskId,
@PathVariable(required = false) Integer transformId,
@RequestParam(value = "expand", required = false) String expand) {
return (writer, builder, converter) -> {
ImportTransform tx = transform(importId, taskId, transformId, true);
if (tx == null) {
converter.transformChain(builder,task(importId, taskId), true, converter.expand(expand, 1));
} else {
ImportTask task = task(importId, taskId);
int index = task.getTransform().getTransforms().indexOf(tx);
converter.transform(builder, tx, index, task, true, converter.expand(expand, 1));
}
};
}
@PutMapping(path = { "/tasks/{taskId}/transforms/{transformId}" }, consumes = {
MediaType.APPLICATION_JSON_VALUE,
MediaTypeExtensions.TEXT_JSON_VALUE})
public ImportWrapper putTransform(
@PathVariable Long importId,
@PathVariable Integer taskId,
@PathVariable Integer transformId,
@RequestParam(value = "expand", required = false) String expand,
@RequestBody ImportTransform importTransform) {
ImportTransform orig = transform(importId, taskId, transformId);
OwsUtils.copy(importTransform, orig, (Class) orig.getClass());
return (writer, builder, converter) -> {
ImportTask task = task(importId, taskId);
int index = task.getTransform().getTransforms().indexOf(orig);
converter.transform(builder, orig, index, task, true, converter.expand(expand, 1));
};
}
@DeleteMapping(path = { "/tasks/{taskId}/transforms/{transformId}" })
public ResponseEntity deleteTransform(
@PathVariable Long importId,
@PathVariable Integer taskId,
@PathVariable Integer transformId,
@RequestParam(value = "expand", required = false) String expand) {
ImportTask task = task(importId, taskId);
ImportTransform tx = transform(importId, taskId, transformId);
boolean result = task.getTransform().remove(tx);
if (result) {
return new ResponseEntity<String>("", HttpStatus.OK);
} else {
return new ResponseEntity<String>("", HttpStatus.NOT_FOUND);
}
}
@Override
public boolean supports(MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
return ImportTransform.class.isAssignableFrom(methodParameter.getParameterType());
}
@Override
protected String getTemplateName(Object object) {
throw new NotImplementedException();
}
@Override
protected <T> ObjectWrapper createObjectWrapper(Class<T> clazz) {
throw new NotImplementedException();
}
@Override
public void configureFreemarker(FreemarkerHTMLMessageConverter converter, Template template) {
throw new NotImplementedException();
}
}