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(final @QueryParam("localSync") boolean localSync) { 034 final RepoTransport[] repoTransport = new RepoTransport[] { authenticateAndCreateLocalRepoTransport() }; 035 try { 036 String callIdentifier = ChangeSetDTOService.class.getName() + ".getChangeSetDTO|" + repositoryName + '|' + getAuth().getUserName() + '|' + localSync; 037 return DeferrableExecutor.getInstance().call( 038 callIdentifier, 039 new CallableProvider<ChangeSetDTO>() { 040 @Override 041 public Callable<ChangeSetDTO> getCallable() { // called synchronously during DeferrableExecutor.call(...) - if called at all 042 final RepoTransport rt = repoTransport[0]; 043 repoTransport[0] = null; 044 return new Callable<ChangeSetDTO>() { 045 @Override 046 public ChangeSetDTO call() throws Exception { // called *A*synchronously 047 try { 048 ChangeSetDTO changeSetDTO = rt.getChangeSetDTO(localSync); 049 return changeSetDTO; 050 } finally { 051 rt.close(); 052 } 053 } 054 }; 055 } 056 }); 057 } finally { 058 if (repoTransport[0] != null) 059 repoTransport[0].close(); 060 } 061 } 062}