use of org.glassfish.jersey.server.model.Invocable in project jersey by jersey.
the class MethodSelectingRouter method isWriteable.
private boolean isWriteable(final RequestSpecificConsumesProducesAcceptor candidate) {
final Invocable invocable = candidate.methodRouting.method.getInvocable();
final Class<?> responseType = Primitives.wrap(invocable.getRawRoutingResponseType());
if (Response.class.isAssignableFrom(responseType) || Void.class.isAssignableFrom(responseType)) {
return true;
}
final Type genericType = invocable.getRoutingResponseType();
final Type genericReturnType = genericType instanceof GenericType ? ((GenericType) genericType).getType() : genericType;
for (final WriterModel model : workers.getWritersModelsForType(responseType)) {
if (model.isWriteable(responseType, genericReturnType, invocable.getHandlingMethod().getDeclaredAnnotations(), candidate.produces.combinedType)) {
return true;
}
}
return false;
}
use of org.glassfish.jersey.server.model.Invocable in project jersey by jersey.
the class MethodSelectingRouter method fillMediaTypes.
private boolean fillMediaTypes(final Set<MediaType> effectiveTypes, final ResourceMethod resourceMethod, final List<MediaType> methodTypes, final boolean inputTypes) {
// Add method types to the resulting list iff there is more than just */*
if (methodTypes.size() > 1 || !methodTypes.contains(MediaType.WILDCARD_TYPE)) {
effectiveTypes.addAll(methodTypes);
}
boolean mediaTypesFromWorkers = effectiveTypes.isEmpty();
if (mediaTypesFromWorkers) {
final Invocable invocableMethod = resourceMethod.getInvocable();
// If not predefined from method - get it from workers.
if (inputTypes) {
fillInputTypesFromWorkers(effectiveTypes, invocableMethod);
} else {
fillOutputTypesFromWorkers(effectiveTypes, invocableMethod.getRawResponseType());
}
mediaTypesFromWorkers = !effectiveTypes.isEmpty();
// If still empty - get all available.
if (!mediaTypesFromWorkers) {
if (inputTypes) {
effectiveTypes.addAll(workers.getMessageBodyReaderMediaTypesByType(Object.class));
} else {
effectiveTypes.addAll(workers.getMessageBodyWriterMediaTypesByType(Object.class));
}
mediaTypesFromWorkers = true;
}
}
return mediaTypesFromWorkers;
}
use of org.glassfish.jersey.server.model.Invocable in project jersey by jersey.
the class NaiveResourceMappingContext method buildMappings.
private void buildMappings() {
if (mappings != null) {
return;
}
mappings = new HashMap<>();
erc.getResourceModel().accept(new ResourceModelVisitor() {
Deque<PathPattern> stack = new LinkedList<>();
private void processComponents(final ResourceModelComponent component) {
final List<? extends ResourceModelComponent> components = component.getComponents();
if (components != null) {
for (final ResourceModelComponent rc : components) {
rc.accept(this);
}
}
}
@Override
public void visitInvocable(final Invocable invocable) {
processComponents(invocable);
}
@Override
public void visitRuntimeResource(final RuntimeResource runtimeResource) {
processComponents(runtimeResource);
}
@Override
public void visitResourceModel(final ResourceModel resourceModel) {
processComponents(resourceModel);
}
@Override
public void visitResourceHandlerConstructor(final HandlerConstructor handlerConstructor) {
processComponents(handlerConstructor);
}
@Override
public void visitMethodHandler(final MethodHandler methodHandler) {
processComponents(methodHandler);
}
@Override
public void visitChildResource(final Resource resource) {
visitResourceIntl(resource, false);
}
@Override
public void visitResource(final Resource resource) {
visitResourceIntl(resource, true);
}
private void visitResourceIntl(final Resource resource, final boolean isRoot) {
try {
stack.addLast(resource.getPathPattern());
processComponents(resource);
if (isRoot) {
Class likelyToBeRoot = null;
for (final Class next : resource.getHandlerClasses()) {
if (!(Inflector.class.isAssignableFrom(next))) {
likelyToBeRoot = next;
}
}
if (likelyToBeRoot != null) {
mappings.put(likelyToBeRoot, getMapping(getTemplate()));
}
}
} finally {
stack.removeLast();
}
}
@Override
public void visitResourceMethod(final ResourceMethod resourceMethod) {
if (resourceMethod.isExtended()) {
return;
}
if (ResourceMethod.JaxrsType.SUB_RESOURCE_LOCATOR.equals(resourceMethod.getType())) {
if (resourceMethod.getInvocable() != null) {
final Invocable i = resourceMethod.getInvocable();
final Type type = i.getResponseType();
final StringBuilder template = getTemplate();
mappings.put((Class) type, getMapping(template));
// Process sub resources ?
Resource.Builder builder = Resource.builder(i.getRawResponseType());
if (builder == null) {
// for example in the case the return type of the sub resource locator is Object
builder = Resource.builder().path(resourceMethod.getParent().getPath());
}
final Resource subResource = builder.build();
visitChildResource(subResource);
}
}
processComponents(resourceMethod);
}
private StringBuilder getTemplate() {
final StringBuilder template = new StringBuilder();
for (final PathPattern pp : stack) {
final String ppTemplate = pp.getTemplate().getTemplate();
final int tlength = template.length();
if (tlength > 0) {
if (template.charAt(tlength - 1) == '/') {
if (ppTemplate.startsWith("/")) {
template.append(ppTemplate, 1, ppTemplate.length());
} else {
template.append(ppTemplate);
}
} else {
if (ppTemplate.startsWith("/")) {
template.append(ppTemplate);
} else {
template.append("/");
template.append(ppTemplate);
}
}
} else {
template.append(ppTemplate);
}
}
return template;
}
});
}
use of org.glassfish.jersey.server.model.Invocable in project jersey by jersey.
the class ServerScopeProvider method getFilteringScopes.
@Override
public Set<String> getFilteringScopes(final Annotation[] entityAnnotations, final boolean defaultIfNotFound) {
Set<String> filteringScope = super.getFilteringScopes(entityAnnotations, false);
if (filteringScope.isEmpty()) {
final ExtendedUriInfo uriInfo = uriInfoProvider.get();
final String path = uriInfo.getPath();
if (uriToContexts.containsKey(path)) {
return uriToContexts.get(path);
}
for (final ResourceMethod method : ServerScopeProvider.getMatchedMethods(uriInfo)) {
final Invocable invocable = method.getInvocable();
mergeFilteringScopes(filteringScope, getFilteringScopes(invocable.getHandlingMethod(), invocable.getHandler().getHandlerClass()));
if (!filteringScope.isEmpty()) {
uriToContexts.putIfAbsent(path, filteringScope);
return filteringScope;
}
}
}
// Use default scope if not in other scope.
return returnFilteringScopes(filteringScope, defaultIfNotFound);
}
use of org.glassfish.jersey.server.model.Invocable in project dropwizard by dropwizard.
the class JerseyViolationExceptionMapper method toResponse.
@Override
public Response toResponse(final JerseyViolationException exception) {
final Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();
final Invocable invocable = exception.getInvocable();
final ImmutableList<String> errors = FluentIterable.from(exception.getConstraintViolations()).transform(violation -> ConstraintMessage.getMessage(violation, invocable)).toList();
final int status = ConstraintMessage.determineStatus(violations, invocable);
return Response.status(status).entity(new ValidationErrorMessage(errors)).build();
}
Aggregations