/*
 * Copyright 2012-2020 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
 *
 *      https://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.repository.config;

import lombok.NonNull;
import lombok.RequiredArgsConstructor;

import java.util.Optional;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.data.config.ConfigurationUtils;
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
import org.springframework.data.util.Streamable;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

Default implementation of RepositoryConfiguration.
Author:Oliver Gierke, Jens Schauder, Mark Paluch
/** * Default implementation of {@link RepositoryConfiguration}. * * @author Oliver Gierke * @author Jens Schauder * @author Mark Paluch */
@RequiredArgsConstructor public class DefaultRepositoryConfiguration<T extends RepositoryConfigurationSource> implements RepositoryConfiguration<T> { public static final String DEFAULT_REPOSITORY_IMPLEMENTATION_POSTFIX = "Impl"; public static final Key DEFAULT_QUERY_LOOKUP_STRATEGY = Key.CREATE_IF_NOT_FOUND; private final @NonNull T configurationSource; private final @NonNull BeanDefinition definition; private final @NonNull RepositoryConfigurationExtension extension; /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getBeanId() */ public String getBeanId() { return StringUtils.uncapitalize(ClassUtils.getShortName(getRepositoryBaseClassName().orElseThrow( () -> new IllegalStateException("Can't create bean identifier without a repository base class defined!")))); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getQueryLookupStrategyKey() */ public Object getQueryLookupStrategyKey() { return configurationSource.getQueryLookupStrategyKey().orElse(DEFAULT_QUERY_LOOKUP_STRATEGY); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getBasePackages() */ public Streamable<String> getBasePackages() { return configurationSource.getBasePackages(); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getImplementationBasePackages() */ @Override public Streamable<String> getImplementationBasePackages() { return Streamable.of(ClassUtils.getPackageName(getRepositoryInterface())); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getRepositoryInterface() */ public String getRepositoryInterface() { return ConfigurationUtils.getRequiredBeanClassName(definition); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getConfigSource() */ public RepositoryConfigurationSource getConfigSource() { return configurationSource; } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getNamedQueryLocation() */ public Optional<String> getNamedQueriesLocation() { return configurationSource.getNamedQueryLocation(); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getImplementationClassName() */ public String getImplementationClassName() { return ClassUtils.getShortName(getRepositoryInterface()).concat( configurationSource.getRepositoryImplementationPostfix().orElse(DEFAULT_REPOSITORY_IMPLEMENTATION_POSTFIX)); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getImplementationBeanName() */ public String getImplementationBeanName() { return configurationSource.generateBeanName(definition) + configurationSource.getRepositoryImplementationPostfix().orElse("Impl"); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getSource() */ @Nullable @Override public Object getSource() { return configurationSource.getSource(); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getConfigurationSource() */ @Override public T getConfigurationSource() { return configurationSource; } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getRepositoryBaseClassName() */ @Override public Optional<String> getRepositoryBaseClassName() { return configurationSource.getRepositoryBaseClassName(); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getRepositoryFactoryBeanClassName() */ @Override public String getRepositoryFactoryBeanClassName() { return configurationSource.getRepositoryFactoryBeanClassName() .orElseGet(extension::getRepositoryFactoryBeanClassName); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#isLazyInit() */ @Override public boolean isLazyInit() { return definition.isLazyInit() || !configurationSource.getBootstrapMode().equals(BootstrapMode.DEFAULT); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#isPrimary() */ @Override public boolean isPrimary() { return definition.isPrimary(); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#getExcludeFilters() */ @Override public Streamable<TypeFilter> getExcludeFilters() { return configurationSource.getExcludeFilters(); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#toImplementationDetectionConfiguration(org.springframework.core.type.classreading.MetadataReaderFactory) */ @Override public ImplementationDetectionConfiguration toImplementationDetectionConfiguration(MetadataReaderFactory factory) { Assert.notNull(factory, "MetadataReaderFactory must not be null!"); return configurationSource.toImplementationDetectionConfiguration(factory); } /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#toLookupConfiguration(org.springframework.core.type.classreading.MetadataReaderFactory) */ @Override public ImplementationLookupConfiguration toLookupConfiguration(MetadataReaderFactory factory) { Assert.notNull(factory, "MetadataReaderFactory must not be null!"); return toImplementationDetectionConfiguration(factory).forRepositoryConfiguration(this); } }