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}