package org.restler.spring.data.calls;
import org.restler.client.Call;
import org.restler.client.CallEnhancer;
import org.restler.client.CallExecutor;
import org.restler.client.RestlerException;
import org.restler.spring.data.proxy.ResourceProxy;
import org.restler.spring.data.util.Repositories;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.Repository;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class SaveSeveralCallEnhancer extends CustomCallEnhancer<SaveSeveralCallEnhancer.SaveSeveralCall> {
private final Repositories repositories;
public SaveSeveralCallEnhancer(Repositories repositories) {
super(SaveSeveralCall.class);
this.repositories = repositories;
}
@Override
protected Object enhance(SaveSeveralCall call, CallExecutor callExecutor) {
Iterable<Object> objectsForSave = call.getObjectsForSave();
List<Object> result = new ArrayList<>();
for(Object objectForSave : objectsForSave) {
Repository repository;
if(objectForSave instanceof ResourceProxy) {
repository = repositories.getByResourceClass(((ResourceProxy)objectForSave).getObject().getClass()).orElse(null);
} else {
repository = repositories.getByResourceClass(objectForSave.getClass()).orElse(null);
}
if (repository == null || !(repository instanceof CrudRepository)) {
throw new RestlerException("Could not find repository for " + objectForSave);
}
result.add(((CrudRepository)repository).save(objectForSave));
}
return result;
}
public static class SaveSeveralCall implements Call {
private final Type returnType;
private final Iterable<Object> objectsForSave;
public SaveSeveralCall(Iterable<Object> objectsForSave, Type returnType) {
this.objectsForSave = objectsForSave;
this.returnType = returnType;
}
@Override
public Type getReturnType() {
return returnType;
}
@Override
public Call withReturnType(Type type) {
return new SaveSeveralCall(objectsForSave, type);
}
public Iterable<Object> getObjectsForSave() {
return objectsForSave;
}
}
}