package co.codewizards.cloudstore.rest.server.service;
import java.util.concurrent.Callable;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import co.codewizards.cloudstore.core.concurrent.CallableProvider;
import co.codewizards.cloudstore.core.concurrent.DeferrableExecutor;
import co.codewizards.cloudstore.core.dto.ChangeSetDto;
//import co.codewizards.cloudstore.core.repo.local.LocalRepoRegistry;
import co.codewizards.cloudstore.core.repo.transport.RepoTransport;
@Path("_ChangeSetDto/{repositoryName}")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class ChangeSetDtoService extends AbstractServiceWithRepoToRepoAuth
{
private static final Logger logger = LoggerFactory.getLogger(ChangeSetDtoService.class);
{
logger.debug("<init>: created new instance");
}
@GET
public ChangeSetDto getChangeSetDto(final @QueryParam("localSync") boolean localSync) {
final RepoTransport[] repoTransport = new RepoTransport[] { authenticateAndCreateLocalRepoTransport() };
try {
final String callIdentifier = ChangeSetDtoService.class.getName() + ".getChangeSetDto|" + repositoryName + '|' + getAuth().getUserName() + '|' + localSync;
return DeferrableExecutor.getInstance().call(
callIdentifier,
new CallableProvider<ChangeSetDto>() {
@Override
public Callable<ChangeSetDto> getCallable() { // called synchronously during DeferrableExecutor.call(...) - if called at all
final RepoTransport rt = repoTransport[0];
repoTransport[0] = null;
return new Callable<ChangeSetDto>() {
@Override
public ChangeSetDto call() throws Exception { // called *A*synchronously
try {
final ChangeSetDto changeSetDto = getChangeSetDto(rt, localSync);
return changeSetDto;
} finally {
rt.close();
}
}
};
}
});
} finally {
if (repoTransport[0] != null)
repoTransport[0].close();
}
}
protected ChangeSetDto getChangeSetDto(final RepoTransport repoTransport, final boolean localSync) {
return repoTransport.getChangeSetDto(localSync);
}
}