From 96d18a13594e7be6dc0946e4d6999f6208fcda02 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Sat, 4 Apr 2015 08:40:21 +0200 Subject: [PATCH] fixed bus in transaction managment --- src/main/java/service/PacmanServiceEJB.java | 27 +++---- src/main/java/service/PacmanWebService.java | 85 ++++++++++++++++----- src/test/java/ClientTest.java | 2 +- 3 files changed, 79 insertions(+), 35 deletions(-) diff --git a/src/main/java/service/PacmanServiceEJB.java b/src/main/java/service/PacmanServiceEJB.java index c89b539..da18227 100644 --- a/src/main/java/service/PacmanServiceEJB.java +++ b/src/main/java/service/PacmanServiceEJB.java @@ -51,46 +51,43 @@ public class PacmanServiceEJB implements PacmanService { Set knownPkg = new HashSet<>(); //Elimina i pacchetti sul DB che non esistono più nel filesystem - List listaDB = em.createQuery("SELECT p FROM PkgData p", PkgData.class).getResultList(); try { ut.setTransactionTimeout(1000); + ut.begin(); + List listaDB = em.createQuery("SELECT p FROM PkgData p", PkgData.class).getResultList(); for (PkgData p : listaDB) { knownPkg.add(p.filePath); File file = new File(p.filePath); if (!file.exists()) { - ut.begin(); log.log(Level.INFO, String.format("Removing package %s", file.getName())); em.remove(p); - ut.commit(); } } - } - catch (NotSupportedException | SystemException | HeuristicMixedException | RollbackException | HeuristicRollbackException e) + ut.commit(); + } catch (NotSupportedException | SystemException | HeuristicMixedException | RollbackException | HeuristicRollbackException e) { throw new RuntimeException(e); } //Aggiunge sul DB i pacchetti presenti nel filesystem Collection ls = FileUtils.listFiles(new File(ctx.getSystemProperties().getProperty("RepoFolder")), new RegexFileFilter(".*\\.pkg\\.tar\\.xz"), DirectoryFileFilter.DIRECTORY); - - for (File file : ls) + try { - if(!knownPkg.contains(file.getAbsolutePath())) + ut.begin(); + for (File file : ls) { - try + if (!knownPkg.contains(file.getAbsolutePath())) { - ut.setTransactionTimeout(1000); - ut.begin(); parseFile(file); - ut.commit(); - } catch (Exception e) - { - throw new RuntimeException(e); } } + ut.commit(); + } catch (Exception e) + { + throw new RuntimeException(e); } } diff --git a/src/main/java/service/PacmanWebService.java b/src/main/java/service/PacmanWebService.java index 39776b2..dc7e5e7 100644 --- a/src/main/java/service/PacmanWebService.java +++ b/src/main/java/service/PacmanWebService.java @@ -2,25 +2,18 @@ package service; import model.PkgData; import model.PkgList; +import org.apache.commons.io.IOUtils; import pacbase.Parser; import persistence.QueryEngine; import javax.ejb.Singleton; import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; +import javax.persistence.*; import javax.ws.rs.*; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileOutputStream; +import javax.ws.rs.core.*; +import java.io.*; import java.net.URI; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; @Path("/pkg") @@ -90,25 +83,66 @@ public class PacmanWebService { TypedQuery hquery = em.createQuery(hashQuery, PkgData.class); if(md5sum != null) hquery.setParameter("md5sum", md5sum); - return manageQueryResult(hquery.getResultList()); + return manageQueryResult(hquery.getResultList(), true); } private Response getPackageByFileName(String file) { TypedQuery fnquery = em.createQuery(fileNameQuery, PkgData.class); fnquery.setParameter("fileName", file); - return manageQueryResult(fnquery.getResultList()); + return manageQueryResult(fnquery.getResultList(), true); + } + + @GET + @Path("download/{filename}") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response downloadPackage(@PathParam("filename") String fileName) + { + TypedQuery fnquery = em.createQuery(fileNameQuery, PkgData.class); + fnquery.setParameter("fileName", fileName); + try + { + PkgData pkg = fnquery.getSingleResult(); + StreamingOutput stream = (OutputStream output) -> + { + FileInputStream input = new FileInputStream(pkg.filePath); + try { + int bytes; + while ((bytes = input.read()) != -1) { + output.write(bytes); + } + } catch (Exception e) { + throw new WebApplicationException(e); + } finally { + if (output != null) output.close(); + if (input != null) input.close(); + } + }; + return Response.ok(stream).header("Content-Length", new File(pkg.filePath).length()).build(); + } + catch (NonUniqueResultException e) + { + throw new InternalServerErrorException(); + } + catch (NoResultException e) + { + throw new NotFoundException(); + } + catch (Exception e) + { + throw new RuntimeException(e); + } } @POST - @Path("/pkg/upload") + @Path("/upload") @Consumes(MediaType.APPLICATION_OCTET_STREAM) - public Response createPackage(byte[] input, @MatrixParam("filename") String filename) throws Exception + public Response createPackage(InputStream input, @MatrixParam("filename") String filename) throws Exception { if (filename == null) throw new BadRequestException(); - String hash = Parser.computeMD5(new ByteArrayInputStream(input)); + String hash = Parser.computeMD5(input); TypedQuery hquery = em.createQuery(hashQuery, PkgData.class); hquery.setParameter("md5sum", hash); @@ -120,9 +154,10 @@ public class PacmanWebService } else { + input.reset(); File file = new File("/tmp/sdf"/*ctx.getSystemProperties().getProperty("RepoFolder")*/, filename); FileOutputStream fos = new FileOutputStream(file); - fos.write(input); + IOUtils.copy(input,fos); fos.close(); PkgData pkg = Parser.parseFile(file); em.persist(pkg); @@ -132,6 +167,11 @@ public class PacmanWebService } private Response manageQueryResult(List list) + { + return manageQueryResult(list, false); + } + + private Response manageQueryResult(List list, boolean singleResult) { // log.log(Level.INFO, "size: " + list.size()); PkgList pkgList = new PkgList(list); @@ -139,9 +179,16 @@ public class PacmanWebService { throw new NotFoundException(); } - else if(pkgList.size()==1) + else if(singleResult) { - return Response.ok(pkgList.get(0)).build(); + if(pkgList.size()==1) + { + return Response.ok(pkgList.get(0)).build(); + } + else + { + throw new NonUniqueResultException("The returned list does not contain a single element"); + } } else { diff --git a/src/test/java/ClientTest.java b/src/test/java/ClientTest.java index 1be3e2f..a5c4c13 100644 --- a/src/test/java/ClientTest.java +++ b/src/test/java/ClientTest.java @@ -58,7 +58,7 @@ public class ClientTest RegisterBuiltin.register(instance); instance.registerProvider(ResteasyJacksonProvider.class); Client client = ClientBuilder.newClient(); - UriBuilder builder = UriBuilder.fromUri("http://localhost:8080/").path("jpacrepo-1.0/rest/pkg/pkg/upload"); + UriBuilder builder = UriBuilder.fromUri("http://localhost:8080/").path("jpacrepo-1.0/rest/pkg/upload"); builder.matrixParam("filename", "k290-fnkeyctl-1.2-1-x86_64.pkg.tar.xz"); WebTarget target = client.target(builder.build()); FileInputStream fis = new FileInputStream(new File("/tmp/k290-fnkeyctl-1.2-1-x86_64.pkg.tar.xz"));