package org.restler.spring.data;
import net.sf.cglib.proxy.InvocationHandler;
import org.restler.client.*;
import org.restler.http.HttpCallExecutor;
import org.restler.http.RequestExecutor;
import org.restler.spring.data.calls.DeleteAllCallEnhancer;
import org.restler.spring.data.calls.SaveSeveralCallEnhancer;
import org.restler.spring.data.util.Repositories;
import org.springframework.data.repository.Repository;
import java.net.URI;
import java.util.List;
public class SpringData extends DefaultCoreModule {
private final URI baseUrl;
private final CallExecutionChain chain;
private final Repositories repositories;
public SpringData(ClientFactory factory, URI baseUrl, RequestExecutor requestExecutor, List<CallEnhancer> enhancers, List<Class<?>> repositories) {
super(factory);
this.baseUrl = baseUrl;
// this leak
this.repositories = new Repositories(repositories, this);
enhancers.add(1, new DeleteAllCallEnhancer(this.repositories));
enhancers.add(1, new SaveSeveralCallEnhancer(this.repositories));
HttpCallExecutor callExecutor = new HttpCallExecutor(requestExecutor);
chain = new CallExecutionChain(callExecutor, enhancers);
}
@Override
public boolean canHandle(ServiceDescriptor descriptor) {
return descriptor instanceof ClassServiceDescriptor && isRepository(((ClassServiceDescriptor) descriptor).getServiceDescriptor());
}
@Override
protected InvocationHandler createHandler(ServiceDescriptor descriptor) {
return new CallExecutorInvocationHandler(chain, new SpringDataMethodInvocationMapper(baseUrl, repositories));
}
private boolean isRepository(Class<?> someClass) {
if (someClass.isInterface()) {
if (someClass == Repository.class) {
return true;
}
Class<?>[] interfaces = someClass.getInterfaces();
for (Class<?> interf : interfaces) {
if (isRepository(interf)) {
return true;
}
}
}
return false;
}
}