/* * Copyright 2012-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.rest.core.support; import static org.springframework.data.rest.core.support.ResourceStringUtils.*; import static org.springframework.core.annotation.AnnotationUtils.*; import static org.springframework.util.StringUtils.*; import java.lang.reflect.Method; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.data.rest.core.config.RepositoryRestConfiguration; import org.springframework.data.rest.core.config.ResourceMapping; /** * Helper methods to get the default rel and path values or to use values supplied by annotations. * * @author Jon Brisbin * @author Florent Biville * @author Oliver Gierke */ @Deprecated public abstract class ResourceMappingUtils { protected ResourceMappingUtils() {} public static String findRel(Class<?> type) { RestResource anno = findAnnotation(type, RestResource.class); if (anno != null) { if (hasText(anno.rel())) { return anno.rel(); } } return uncapitalize(type.getSimpleName().replaceAll("Repository", "")); } public static String findRel(Method method) { RestResource anno = findAnnotation(method, RestResource.class); if (anno != null) { if (hasText(anno.rel())) { return anno.rel(); } } return method.getName(); } public static String formatRel(RepositoryRestConfiguration config, RepositoryInformation repoInfo, PersistentProperty<?> persistentProperty) { if (persistentProperty == null) { return null; } ResourceMapping repoMapping = getResourceMapping(config, repoInfo); ResourceMapping entityMapping = getResourceMapping(config, persistentProperty.getOwner()); ResourceMapping propertyMapping = entityMapping.getResourceMappingFor(persistentProperty.getName()); return String.format("%s.%s.%s", repoMapping.getRel(), entityMapping.getRel(), (null != propertyMapping ? propertyMapping.getRel() : persistentProperty.getName())); } public static String findPath(Class<?> type) { RestResource anno = findAnnotation(type, RestResource.class); if (anno != null) { if (hasTextExceptSlash(anno.path())) { return removeLeadingSlash(anno.path()); } } return uncapitalize(type.getSimpleName().replaceAll("Repository", "")); } public static String findPath(Method method) { RestResource anno = findAnnotation(method, RestResource.class); if (anno != null) { if (hasTextExceptSlash(anno.path())) { return removeLeadingSlash(anno.path()); } } return method.getName(); } public static boolean findExported(Class<?> type) { RestResource anno = findAnnotation(type, RestResource.class); return anno == null || anno.exported(); } public static boolean findExported(Method method) { RestResource anno = findAnnotation(method, RestResource.class); return anno == null || anno.exported(); } public static ResourceMapping getResourceMapping(RepositoryRestConfiguration config, RepositoryInformation repoInfo) { if (null == repoInfo) { return null; } Class<?> repoType = repoInfo.getRepositoryInterface(); ResourceMapping mapping = (null != config ? config.getResourceMappingForRepository(repoType) : null); return merge(repoType, mapping); } public static ResourceMapping getResourceMapping(RepositoryRestConfiguration config, PersistentEntity<?, ?> persistentEntity) { if (null == persistentEntity) { return null; } Class<?> domainType = persistentEntity.getType(); ResourceMapping mapping = (null != config ? config.getResourceMappingForDomainType(domainType) : null); return merge(domainType, mapping); } public static ResourceMapping merge(Method method, ResourceMapping mapping) { ResourceMapping defaultMapping = new ResourceMapping(findRel(method), findPath(method), findExported(method)); if (null != mapping) { return new ResourceMapping((null != mapping.getRel() ? mapping.getRel() : defaultMapping.getRel()), (null != mapping.getPath() ? mapping.getPath() : defaultMapping.getPath()), (mapping.isExported() != defaultMapping.isExported() ? mapping.isExported() : defaultMapping.isExported())); } return defaultMapping; } public static ResourceMapping merge(Class<?> type, ResourceMapping mapping) { ResourceMapping defaultMapping = new ResourceMapping(findRel(type), findPath(type), findExported(type)); if (null != mapping) { return new ResourceMapping((null != mapping.getRel() ? mapping.getRel() : defaultMapping.getRel()), (null != mapping.getPath() ? mapping.getPath() : defaultMapping.getPath()), (mapping.isExported() != defaultMapping.isExported() ? mapping.isExported() : defaultMapping.isExported())) .addResourceMappings(mapping.getResourceMappings()); } return defaultMapping; } }