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                        final 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                                                                                final ChangeSetDto changeSetDto = getChangeSetDto(rt, 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
063        protected ChangeSetDto getChangeSetDto(final RepoTransport repoTransport, final boolean localSync) {
064                return repoTransport.getChangeSetDto(localSync);
065        }
066}