use of org.springframework.web.bind.annotation.PathVariable in project dhis2-core by dhis2.
the class TrackedEntityInstanceController method getAttributeImage.
@GetMapping("/{teiId}/{attributeId}/image")
public void getAttributeImage(@PathVariable("teiId") String teiId, @PathVariable("attributeId") String attributeId, @RequestParam(required = false) Integer width, @RequestParam(required = false) Integer height, @RequestParam(required = false) ImageFileDimension dimension, HttpServletResponse response) throws WebMessageException {
User user = currentUserService.getCurrentUser();
org.hisp.dhis.trackedentity.TrackedEntityInstance trackedEntityInstance = instanceService.getTrackedEntityInstance(teiId);
List<String> trackerAccessErrors = trackerAccessManager.canRead(user, trackedEntityInstance);
List<TrackedEntityAttributeValue> attribute = trackedEntityInstance.getTrackedEntityAttributeValues().stream().filter(val -> val.getAttribute().getUid().equals(attributeId)).collect(Collectors.toList());
if (!trackerAccessErrors.isEmpty()) {
throw new WebMessageException(unauthorized("You're not authorized to access the TrackedEntityInstance with id: " + teiId));
}
if (attribute.size() == 0) {
throw new WebMessageException(notFound("Attribute not found for ID " + attributeId));
}
TrackedEntityAttributeValue value = attribute.get(0);
if (value == null) {
throw new WebMessageException(notFound("Value not found for ID " + attributeId));
}
if (value.getAttribute().getValueType() != ValueType.IMAGE) {
throw new WebMessageException(conflict("Attribute must be of type image"));
}
// ---------------------------------------------------------------------
// Get file resource
// ---------------------------------------------------------------------
FileResource fileResource = fileResourceService.getFileResource(value.getValue());
if (fileResource == null || fileResource.getDomain() != FileResourceDomain.DATA_VALUE) {
throw new WebMessageException(notFound("A data value file resource with id " + value.getValue() + " does not exist."));
}
if (fileResource.getStorageStatus() != FileResourceStorageStatus.STORED) {
throw new WebMessageException(conflict("The content is being processed and is not available yet. Try again later.", "The content requested is in transit to the file store and will be available at a later time."));
}
// ---------------------------------------------------------------------
// Build response and return
// ---------------------------------------------------------------------
FileResourceUtils.setImageFileDimensions(fileResource, MoreObjects.firstNonNull(dimension, ImageFileDimension.ORIGINAL));
response.setContentType(fileResource.getContentType());
response.setContentLength((int) fileResource.getContentLength());
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "filename=" + fileResource.getName());
try (InputStream inputStream = fileResourceService.getFileResourceContent(fileResource)) {
BufferedImage img = ImageIO.read(inputStream);
height = height == null ? img.getHeight() : height;
width = width == null ? img.getWidth() : width;
BufferedImage resizedImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D canvas = resizedImg.createGraphics();
canvas.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
canvas.drawImage(img, 0, 0, width, height, null);
canvas.dispose();
ImageIO.write(resizedImg, fileResource.getFormat(), response.getOutputStream());
} catch (IOException ex) {
throw new WebMessageException(error("Failed fetching the file from storage", "There was an exception when trying to fetch the file from the storage backend."));
}
}
use of org.springframework.web.bind.annotation.PathVariable in project dhis2-core by dhis2.
the class TrackerImportController method getJobReport.
@GetMapping(value = "/jobs/{uid}/report", produces = APPLICATION_JSON_VALUE)
public TrackerImportReport getJobReport(@PathVariable String uid, @RequestParam(defaultValue = "errors", required = false) String reportMode, HttpServletResponse response) throws HttpStatusCodeException, NotFoundException {
TrackerBundleReportMode trackerBundleReportMode = TrackerBundleReportMode.getTrackerBundleReportMode(reportMode);
setNoStore(response);
return Optional.ofNullable(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).map(report -> trackerImportService.buildImportReport((TrackerImportReport) report, trackerBundleReportMode)).orElseThrow(() -> NotFoundException.notFoundUid(uid));
}
use of org.springframework.web.bind.annotation.PathVariable in project judge by zjnu-acm.
the class MockGenerator method generate.
private void generate(Class<?> key, RequestMappingInfo requestMappingInfo, HandlerMethod handlerMethod, String url, TestClass testClass, String lowerMethod) {
Method method = handlerMethod.getMethod();
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
out.println("/**");
out.println(" * Test of " + method.getName() + " method, of class " + key.getSimpleName() + ".");
for (Class<?> type : method.getParameterTypes()) {
testClass.addImport(type);
}
out.println(" *");
out.println(" * {@link " + key.getSimpleName() + "#" + method.getName() + Arrays.stream(method.getParameterTypes()).map(Class::getSimpleName).collect(Collectors.joining(", ", "(", ")}")));
out.println(" */");
testClass.addImport(Test.class);
out.println("@Test");
out.println("public void test" + StringUtils.capitalize(method.getName()) + "() throws Exception {");
out.println("\tlog.info(\"" + method.getName() + "\");");
List<String> variableDeclares = new ArrayList<>(4);
Map<String, Class<?>> params = new LinkedHashMap<>(4);
String body = null;
Class<?> bodyType = null;
MethodParameter[] methodParameters = handlerMethod.getMethodParameters();
Parameter[] parameters = method.getParameters();
List<String> files = new ArrayList<>(4);
List<String> pathVariables = new ArrayList<>(4);
Map<String, String> headers = Maps.newTreeMap();
String locale = null;
for (MethodParameter methodParameter : methodParameters) {
Class<?> type = methodParameter.getParameterType();
String typeName = type.getSimpleName();
String name = "";
testClass.addImport(type);
boolean unknown = false;
RequestParam requestParam = methodParameter.getParameterAnnotation(RequestParam.class);
PathVariable pathVariable = methodParameter.getParameterAnnotation(PathVariable.class);
RequestHeader requestHeader = methodParameter.getParameterAnnotation(RequestHeader.class);
if (requestParam != null) {
name = requestParam.value();
if (name.isEmpty()) {
name = requestParam.name();
}
} else if (pathVariable != null) {
name = pathVariable.value();
if (name.isEmpty()) {
name = pathVariable.name();
}
if (name.isEmpty()) {
name = parameters[methodParameter.getParameterIndex()].getName();
}
pathVariables.add(name);
variableDeclares.add("\t" + typeName + " " + name + " = " + getDefaultValue(type) + ";");
continue;
} else if (methodParameter.hasParameterAnnotation(RequestBody.class)) {
body = "request";
bodyType = type;
variableDeclares.add("\t" + typeName + " request = " + getDefaultValue(type) + ";");
continue;
} else if (requestHeader != null) {
name = requestHeader.value();
if (name.isEmpty()) {
name = requestHeader.name();
}
if (name.isEmpty()) {
name = parameters[methodParameter.getParameterIndex()].getName();
}
String camelCase = camelCase(name);
headers.put(name, camelCase);
variableDeclares.add("\t" + typeName + " " + camelCase + " = " + getDefaultValue(type) + ";");
continue;
} else if (HttpServletResponse.class == type || HttpServletRequest.class == type) {
continue;
} else if (Locale.class == type) {
locale = "locale";
variableDeclares.add("\t" + typeName + " " + locale + " = Locale.getDefault();");
continue;
} else {
unknown = true;
}
if (name.isEmpty()) {
name = parameters[methodParameter.getParameterIndex()].getName();
}
if (unknown && type.getClassLoader() != null && type != MultipartFile.class) {
ReflectionUtils.doWithFields(type, field -> process(field.getName(), camelCase(field.getName()), field.getType(), params, files, variableDeclares, testClass, method, lowerMethod), field -> !Modifier.isStatic(field.getModifiers()));
continue;
} else if (unknown) {
System.err.println("param " + methodParameter.getParameterIndex() + " with type " + typeName + " in " + method + " has no annotation");
}
process(name, camelCase(name), type, params, files, variableDeclares, testClass, method, lowerMethod);
}
for (String variableDeclare : variableDeclares) {
out.println(variableDeclare);
}
testClass.addImport(MvcResult.class);
if (files.isEmpty()) {
testClass.addStaticImport(MockMvcRequestBuilders.class, lowerMethod);
out.print("\tMvcResult result = mvc.perform(" + lowerMethod + "(" + url);
for (String pathVariable : pathVariables) {
out.print(", " + pathVariable);
}
out.print(")");
} else {
String methodName = "multipart";
if (!ClassUtils.hasMethod(MockMvcRequestBuilders.class, "multipart", String.class, String[].class)) {
methodName = "fileUpload";
}
testClass.addStaticImport(MockMvcRequestBuilders.class, methodName);
out.print("\tMvcResult result = mvc.perform(" + methodName + "(" + url);
for (String pathVariable : pathVariables) {
out.print(", " + pathVariable);
}
out.print(")");
for (String file : files) {
out.print(".file(" + file + ")");
}
}
boolean newLine = params.size() >= 2;
for (Map.Entry<String, Class<?>> entry : params.entrySet()) {
String paramName = entry.getKey();
String variableName = camelCase(paramName);
Class<?> paramType = entry.getValue();
String value;
if (paramType.isPrimitive()) {
value = com.google.common.primitives.Primitives.wrap(paramType).getSimpleName() + ".toString(" + variableName + ")";
} else if (paramType == String.class) {
value = variableName;
} else {
testClass.addImport(Objects.class);
value = "Objects.toString(" + variableName + ", \"\")";
}
if (newLine) {
out.println();
out.print("\t\t\t");
}
out.print(".param(\"" + paramName + "\", " + value + ")");
}
for (Map.Entry<String, String> entry : headers.entrySet()) {
out.println();
out.print("\t\t\t.header(\"" + entry.getKey() + "\", " + entry.getValue() + ")");
}
if (locale != null) {
out.println();
out.print("\t\t\t.locale(" + locale + ")");
}
switch(lowerMethod) {
case "get":
case "delete":
if (body != null) {
System.err.println("RequestBody annotation found on " + method + " with request method " + lowerMethod);
}
if (!requestMappingInfo.getConsumesCondition().isEmpty()) {
System.err.println("request consumes " + requestMappingInfo.getConsumesCondition() + " found on " + method);
}
}
if (body != null) {
out.println();
if (bodyType == String.class || bodyType == byte[].class) {
out.print("\t\t\t.content(" + body + ")");
} else {
testClass.addField(ObjectMapper.class, "objectMapper", "@Autowired");
out.print("\t\t\t.content(objectMapper.writeValueAsString(" + body + "))");
}
testClass.addImport(MediaType.class);
out.print(".contentType(MediaType.APPLICATION_JSON)");
}
testClass.addStaticImport(MockMvcResultMatchers.class, "status");
out.println(")");
out.println("\t\t\t.andExpect(status().isOk())");
out.println("\t\t\t.andReturn();");
out.println("}");
testClass.addMethod(sw.toString());
}
use of org.springframework.web.bind.annotation.PathVariable in project vorto by eclipse.
the class DefaultPayloadMappingService method getModelContentByModelAndMappingId.
private IModel getModelContentByModelAndMappingId(final String _modelId, @PathVariable final String mappingId) {
final ModelId modelId = ModelId.fromPrettyFormat(_modelId);
final ModelId mappingModelId = ModelId.fromPrettyFormat(mappingId);
IModelRepository repository = this.modelRepositoryFactory.getRepositoryByModel(modelId);
ModelInfo vortoModelInfo = repository.getById(modelId);
ModelInfo mappingModelInfo = this.modelRepositoryFactory.getRepositoryByModel(mappingModelId).getById(mappingModelId);
if (vortoModelInfo == null) {
throw new ModelNotFoundException(String.format("Could not find vorto model with ID: %s", modelId));
} else if (mappingModelInfo == null) {
throw new ModelNotFoundException(String.format("Could not find mapping with ID: %s", mappingId));
}
IModelWorkspace mappingWorkspace = getWorkspaceForModel(mappingModelInfo.getId());
Optional<Model> model = mappingWorkspace.get().stream().filter(_model -> ModelUtils.fromEMFModelId(ModelIdFactory.newInstance(_model)).equals(vortoModelInfo.getId())).findFirst();
if (model.isPresent()) {
final Model flattenedModel = ModelConversionUtils.convertToFlatHierarchy(model.get());
return ModelDtoFactory.createResource(flattenedModel, Optional.of((MappingModel) mappingWorkspace.get().stream().filter(_model -> _model instanceof MappingModel && mappingMatchesModelId((MappingModel) _model, vortoModelInfo)).findFirst().get()));
} else {
return null;
}
}
use of org.springframework.web.bind.annotation.PathVariable in project vorto by eclipse.
the class ModelRepositoryController method getModelForUI.
/**
* Fetches all data required to populate the returned {@link ModelFullDetailsDTO} (see class docs
* for details), in addition the model's "file" contents as file added to the response.<br/>
* Following error cases apply:
* <ul>
* <li>
* If {@link ModelId#fromPrettyFormat(String)} fails throwing {@link IllegalArgumentException},
* returns {@code null} with status {@link HttpStatus#NOT_FOUND}.
* </li>
* <li>
* If {@link ModelRepositoryController#getWorkspaceId(String)} fails throwing
* {@link FatalModelRepositoryException}, returns {@code null} with status
* {@link HttpStatus#NOT_FOUND}.
* </li>
* <li>
* If any operation such as:
* <ul>
* <li>
* {@link IModelRepository#getByIdWithPlatformMappings(ModelId)}
* </li>
* <li>
* {@link IModelRepository#getAttachments(ModelId)}
* </li>
* <li>
* {@link IModelPolicyManager#getPolicyEntries(ModelId)}
* </li>
* </ul>
* ... fails throwing {@link NotAuthorizedException}, returns {@code null} with status
* {@link HttpStatus#FORBIDDEN};
* </li>
* </ul>
*
* @param modelId
* @return
*/
@GetMapping("/ui/{modelId:.+}")
public ResponseEntity<ModelFullDetailsDTO> getModelForUI(@PathVariable String modelId, final HttpServletResponse response) {
try {
// resolve user
Authentication user = SecurityContextHolder.getContext().getAuthentication();
// resolve model ID
ModelId modelID = ModelId.fromPrettyFormat(modelId);
// resolve ModeShape workspace ID
String workspaceId = getWorkspaceId(modelId);
// fetches model info
ModelInfo modelInfo = getModelRepository(modelID).getByIdWithPlatformMappings(modelID);
if (Objects.isNull(modelInfo)) {
LOGGER.warn(String.format("Model resource with id [%s] not found. ", modelId));
return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
}
// starts spawning threads to retrieve models etc.
final ExecutorService executor = Executors.newCachedThreadPool();
// fetches mappings
Collection<ModelMinimalInfoDTO> mappings = ConcurrentHashMap.newKeySet();
modelInfo.getPlatformMappings().entrySet().stream().forEach(e -> {
executor.submit(new AsyncModelMappingsFetcher(mappings, e).with(SecurityContextHolder.getContext()).with(RequestContextHolder.getRequestAttributes()).with(getModelRepositoryFactory()));
});
// fetches references from model ids built with the root ModelInfo
Collection<ModelMinimalInfoDTO> references = ConcurrentHashMap.newKeySet();
modelInfo.getReferences().stream().forEach(id -> executor.submit(new AsyncModelReferenceFetcher(references, id).with(SecurityContextHolder.getContext()).with(RequestContextHolder.getRequestAttributes()).with(getModelRepositoryFactory())));
// fetches referenced by
Collection<ModelMinimalInfoDTO> referencedBy = ConcurrentHashMap.newKeySet();
modelInfo.getReferencedBy().stream().forEach(id -> executor.submit(new AsyncModelReferenceFetcher(referencedBy, id).with(SecurityContextHolder.getContext()).with(RequestContextHolder.getRequestAttributes()).with(getModelRepositoryFactory())));
// fetches attachments
Collection<Attachment> attachments = ConcurrentHashMap.newKeySet();
executor.submit(new AsyncModelAttachmentsFetcher(attachments, modelID, userRepositoryRoleService.isSysadmin(user.getName())).with(SecurityContextHolder.getContext()).with(RequestContextHolder.getRequestAttributes()).with(getModelRepositoryFactory()));
// fetches links
Collection<ModelLink> links = ConcurrentHashMap.newKeySet();
executor.submit(new AsyncModelLinksFetcher(modelID, links).with(SecurityContextHolder.getContext()).with(RequestContextHolder.getRequestAttributes()).with(getModelRepositoryFactory()));
// fetches available workflow actions
Collection<String> actions = ConcurrentHashMap.newKeySet();
executor.submit(new AsyncWorkflowActionsFetcher(workflowService, actions, modelID, UserContext.user(user, workspaceId)).with(SecurityContextHolder.getContext()).with(RequestContextHolder.getRequestAttributes()));
// fetches model syntax
Future<String> encodedSyntaxFuture = executor.submit(new AsyncModelSyntaxFetcher(modelID, SecurityContextHolder.getContext(), RequestContextHolder.getRequestAttributes(), getModelRepositoryFactory()));
// shuts down executor and waits for completion of tasks until configured timeout
// also retrieves callable content
executor.shutdown();
// single-threaded calls
// fetches policies in this thread
Collection<PolicyEntry> policies = getPolicyManager(workspaceId).getPolicyEntries(modelID).stream().filter(p -> userHasPolicyEntry(p, user, workspaceId)).collect(Collectors.toList());
// getting callables and setting executor timeout
String encodedSyntax = null;
try {
// callable content
encodedSyntax = encodedSyntaxFuture.get();
// timeout
if (!executor.awaitTermination(requestTimeoutInSeconds, TimeUnit.SECONDS)) {
LOGGER.warn(String.format("Requesting UI data for model ID [%s] took over [%d] seconds and programmatically timed out.", modelID, requestTimeoutInSeconds));
return new ResponseEntity<>(null, HttpStatus.GATEWAY_TIMEOUT);
}
} catch (InterruptedException ie) {
LOGGER.error("Awaiting executor termination was interrupted.");
return new ResponseEntity<>(null, HttpStatus.SERVICE_UNAVAILABLE);
} catch (ExecutionException ee) {
LOGGER.error("Failed to retrieve and encode model syntax asynchronously");
return new ResponseEntity<>(null, HttpStatus.SERVICE_UNAVAILABLE);
}
// builds DTO
ModelFullDetailsDTO dto = new ModelFullDetailsDTO().withModelInfo(modelInfo).withMappings(mappings).withReferences(references).withReferencedBy(referencedBy).withAttachments(attachments).withLinks(links).withActions(actions).withEncodedModelSyntax(encodedSyntax).withPolicies(policies);
return new ResponseEntity<>(dto, HttpStatus.OK);
}// could not resolve "pretty format" for given model ID
catch (IllegalArgumentException iae) {
LOGGER.warn(String.format("Could not resolve given model ID [%s]", modelId), iae);
return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
}// could not find namespace to resolve workspace ID from
catch (FatalModelRepositoryException fmre) {
LOGGER.warn(String.format("Could not resolve workspace ID from namespace inferred by model ID [%s]", modelId), fmre);
return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
} catch (NotAuthorizedException nae) {
LOGGER.warn(String.format("Could not authorize fetching data from given model ID [%s] for calling user", modelId), nae);
return new ResponseEntity<>(null, HttpStatus.FORBIDDEN);
}
}
Aggregations