/*
* Copyright 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.socialsignin.spring.data.dynamodb.repository.support;
import static org.springframework.data.querydsl.QueryDslUtils.QUERY_DSL_PRESENT;
import java.io.Serializable;
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
import org.socialsignin.spring.data.dynamodb.repository.DynamoDBCrudRepository;
import org.socialsignin.spring.data.dynamodb.repository.query.DynamoDBQueryLookupStrategy;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.data.repository.core.RepositoryInformation;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.data.repository.query.QueryLookupStrategy;
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
/**
* @author Michael Lavelle
*/
public class DynamoDBRepositoryFactory extends RepositoryFactorySupport {
private final DynamoDBOperations dynamoDBOperations;
public DynamoDBRepositoryFactory(DynamoDBOperations dynamoDBOperations) {
this.dynamoDBOperations = dynamoDBOperations;
}
@Override
public <T, ID extends Serializable> DynamoDBEntityInformation<T, ID> getEntityInformation(final Class<T> domainClass) {
final DynamoDBEntityMetadataSupport<T, ID> metadata = new DynamoDBEntityMetadataSupport<T, ID>(domainClass);
return metadata.getEntityInformation();
}
@Override
protected QueryLookupStrategy getQueryLookupStrategy(Key key) {
return DynamoDBQueryLookupStrategy.create(dynamoDBOperations, key);
}
/**
* Callback to create a {@link DynamoDBCrudRepository} instance with the given {@link RepositoryMetadata}
*
* @param <T>
* @param <ID>
* @param metadata
* @see #getTargetRepository(RepositoryInformation)
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
protected <T, ID extends Serializable> DynamoDBCrudRepository<?, ?> getDynamoDBRepository(
RepositoryMetadata metadata) {
return new SimpleDynamoDBPagingAndSortingRepository(getEntityInformation(metadata.getDomainType()),
dynamoDBOperations, getEnableScanPermissions(metadata));
}
protected EnableScanPermissions getEnableScanPermissions(RepositoryMetadata metadata) {
return new EnableScanAnnotationPermissions(metadata.getRepositoryInterface());
}
@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
if (isQueryDslRepository(metadata.getRepositoryInterface())) {
throw new IllegalArgumentException("QueryDsl Support has not been implemented yet.");
}
return SimpleDynamoDBPagingAndSortingRepository.class;
}
private static boolean isQueryDslRepository(Class<?> repositoryInterface) {
return QUERY_DSL_PRESENT && QueryDslPredicateExecutor.class.isAssignableFrom(repositoryInterface);
}
@Override
protected Object getTargetRepository(RepositoryInformation metadata) {
return getDynamoDBRepository(metadata);
}
}