001package co.codewizards.cloudstore.rest.server.service; 002 003import java.util.concurrent.Callable; 004 005import javax.ws.rs.Consumes; 006import javax.ws.rs.GET; 007import javax.ws.rs.Path; 008import javax.ws.rs.Produces; 009import javax.ws.rs.QueryParam; 010import javax.ws.rs.core.MediaType; 011 012import org.slf4j.Logger; 013import org.slf4j.LoggerFactory; 014 015import co.codewizards.cloudstore.core.concurrent.CallableProvider; 016import co.codewizards.cloudstore.core.concurrent.DeferrableExecutor; 017import co.codewizards.cloudstore.core.dto.ChangeSetDto; 018//import co.codewizards.cloudstore.core.repo.local.LocalRepoRegistry; 019import co.codewizards.cloudstore.core.repo.transport.RepoTransport; 020 021@Path("_ChangeSetDto/{repositoryName}") 022@Consumes(MediaType.APPLICATION_XML) 023@Produces(MediaType.APPLICATION_XML) 024public class ChangeSetDtoService extends AbstractServiceWithRepoToRepoAuth 025{ 026 private static final Logger logger = LoggerFactory.getLogger(ChangeSetDtoService.class); 027 028 { 029 logger.debug("<init>: created new instance"); 030 } 031 032 @GET 033 public ChangeSetDto getChangeSetDto(@QueryParam("localSync") final boolean localSync, 034 @QueryParam("lastSyncToRemoteRepoLocalRepositoryRevisionSynced") final Long lastSyncToRemoteRepoLocalRepositoryRevisionSynced) { 035 final RepoTransport[] repoTransport = new RepoTransport[] { authenticateAndCreateLocalRepoTransport() }; 036 try { 037 final String callIdentifier = ChangeSetDtoService.class.getName() + ".getChangeSetDto|" + repositoryName + '|' + getAuth().getUserName() + '|' + localSync + '|' + lastSyncToRemoteRepoLocalRepositoryRevisionSynced; 038 return DeferrableExecutor.getInstance().call( 039 callIdentifier, 040 new CallableProvider<ChangeSetDto>() { 041 @Override 042 public Callable<ChangeSetDto> getCallable() { // called synchronously during DeferrableExecutor.call(...) - if called at all 043 final RepoTransport rt = repoTransport[0]; 044 repoTransport[0] = null; 045 return new Callable<ChangeSetDto>() { 046 @Override 047 public ChangeSetDto call() throws Exception { // called *A*synchronously 048 try { 049 final ChangeSetDto changeSetDto = getChangeSetDto(rt, localSync, lastSyncToRemoteRepoLocalRepositoryRevisionSynced); 050 return changeSetDto; 051 } finally { 052 rt.close(); 053 } 054 } 055 }; 056 } 057 }); 058 } finally { 059 if (repoTransport[0] != null) 060 repoTransport[0].close(); 061 } 062 } 063 064 protected ChangeSetDto getChangeSetDto(final RepoTransport repoTransport, final boolean localSync, final Long lastSyncToRemoteRepoLocalRepositoryRevisionSynced) { 065 return repoTransport.getChangeSetDto(localSync, lastSyncToRemoteRepoLocalRepositoryRevisionSynced); 066 } 067}