private static final MediaTypeCapabilities resolveMediaTypeCapabilities( final Resource resource, final ResourceMethod resourceMethod) { MediaTypeCapabilities resourceMediaTypeCapabilities = resource.getMediaTypeCapabilities(); MediaTypeCapabilities methodMediaTypeCapabilities = resourceMethod.getUriMapping().getMediaTypeCapabilities(); MediaTypeCapabilities mediaTypeCapabilities = new MediaTypeCapabilities(); if (!methodMediaTypeCapabilities.getConsumedMimeTypes().isEmpty()) { mediaTypeCapabilities.setConsumedMimeTypes( methodMediaTypeCapabilities.getConsumedMimeTypes()); } else if (!resourceMediaTypeCapabilities.getConsumedMimeTypes().isEmpty()) { mediaTypeCapabilities.setConsumedMimeTypes( resourceMediaTypeCapabilities.getConsumedMimeTypes()); } else { // leave empty collection // mediaTypeCapabilities.setConsumedMimeTypes(Arrays.asList("*/*")); } if (!methodMediaTypeCapabilities.getProducedMimeTypes().isEmpty()) { mediaTypeCapabilities.setProducedMimeTypes( methodMediaTypeCapabilities.getProducedMimeTypes()); } else if (!resourceMediaTypeCapabilities.getProducedMimeTypes().isEmpty()) { mediaTypeCapabilities.setProducedMimeTypes( resourceMediaTypeCapabilities.getProducedMimeTypes()); } else { // leave empty collection // mediaTypeCapabilities.setProducedMimeTypes(Arrays.asList("*/*")); } return mediaTypeCapabilities; }
/** * @param progressMonitor * @param uriMappings * @param resource * @param methodsStack * @throws CoreException */ private void resolveResourcesUriMappings( final Resource resource, final String uriTemplateFragment, final Map<ResolvedUriMapping, Stack<ResourceMethod>> uriMappings, final Stack<ResourceMethod> methodsStack, final IProgressMonitor progressMonitor) throws CoreException { // resource resourceMethods and subresources resourceMethods are treated the same way for (ResourceMethod resourceMethod : resource.getAllMethods()) { String uriPathTemplate = resolveURIPathTemplate(uriTemplateFragment, resource, resourceMethod); MediaTypeCapabilities mediaTypeCapabilities = resolveMediaTypeCapabilities(resource, resourceMethod); UriMapping resourceUriMapping = resourceMethod.getUriMapping(); ResolvedUriMapping uriMapping = new ResolvedUriMapping( resourceUriMapping.getHTTPMethod(), uriPathTemplate, resourceUriMapping.getQueryParams(), mediaTypeCapabilities); @SuppressWarnings("unchecked") Stack<ResourceMethod> stack = (Stack<ResourceMethod>) methodsStack.clone(); stack.add(resourceMethod); uriMappings.put(uriMapping, stack); } // TODO : verify support chain of subresource locators // TODO : stack resourceMethods and detect+prevent cycles for (ResourceMethod resourceMethod : resource.getSubresourceLocators()) { String uriPathTemplate = resolveURIPathTemplate(uriTemplateFragment, resource, resourceMethod); IType returnType = resourceMethod.getReturnType(); if (returnType == null) { continue; } ITypeHierarchy subresourceTypeHierarchy = JdtUtils.resolveTypeHierarchy(returnType, false, progressMonitor); for (IType subresourceType : subresourceTypeHierarchy.getSubtypes(returnType)) { Resource subresource = getByType(subresourceType); if (subresource != null && !subresource.isRootResource()) { @SuppressWarnings("unchecked") Stack<ResourceMethod> stack = (Stack<ResourceMethod>) methodsStack.clone(); stack.add(resourceMethod); resolveResourcesUriMappings( subresource, uriPathTemplate, uriMappings, stack, progressMonitor); } } } }
// FIXME : include method parameters if annotated with @QueryParam private static final String resolveURIPathTemplate( final String uriTemplateFragment, final Resource resource, final ResourceMethod resourceMethod) { StringBuffer uriTemplateBuffer = new StringBuffer(uriTemplateFragment); String resourceUriPathTemplate = resource.getUriPathTemplate(); String methodUriPathTemplate = resourceMethod.getUriMapping().getUriPathTemplateFragment(); if (resourceUriPathTemplate != null) { uriTemplateBuffer.append("/").append(resourceUriPathTemplate); } if (methodUriPathTemplate != null) { uriTemplateBuffer.append("/").append(methodUriPathTemplate); } return uriTemplateBuffer .toString() .replaceAll("/\\*", "/") .replaceAll("///", "/") .replaceAll("//", "/"); }