package scrum.server.project; import ilarkesto.base.Utl; import ilarkesto.core.logging.Log; import ilarkesto.io.IO; import ilarkesto.io.zip.Deflater; import ilarkesto.io.zip.ZipOutputStream; import ilarkesto.persistence.AEntity; import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; public class ProjectZipper { private static final Log LOG = Log.get(ProjectZipper.class); private File dataDir; private Project project; private ZipOutputStream zipout; public ProjectZipper(File dataDir, Project project) { super(); this.dataDir = dataDir; this.project = project; } public void createZip(OutputStream out) { zipout = new ZipOutputStream(new BufferedOutputStream(out)); zipout.setLevel(Deflater.BEST_COMPRESSION); try { zipFiles(); } catch (Exception ex) { IO.closeQuiet(zipout); throw new RuntimeException(ex); } try { zipout.close(); } catch (IOException ex) { throw new RuntimeException(ex); } } private void zipFiles() throws Exception { zipEntities("project", Utl.toList(project)); zipEntities("user", project.getParticipants()); zipEntities("sprint", project.getSprints()); zipEntities("requirement", project.getRequirements()); zipEntities("quality", project.getQualitys()); zipEntities("task", project.getTasks()); zipEntities("impediment", project.getImpediments()); zipEntities("issue", project.getIssues()); zipEntities("risk", project.getRisks()); zipEntities("wikipage", project.getWikipages()); zipEntities("simpleEvent", project.getSimpleEvents()); zipEntities("file", project.getFiles()); zipEntities("release", project.getReleases()); zipEntities("projectSprintSnapshot", project.getSprintSnapshots()); zipEntities("requirementEstimationVote", project.getRequirementEstimationVotes()); zipEntities("sprintDaySnapshot", project.getExistingSprintDaySnapshots()); zipEntities("projectUserConfig", project.getUserConfigs()); zipEntities("projectEvent", project.getProjectEvents()); zipEntities("comment", project.getAllComments()); for (scrum.server.files.File fle : project.getFiles()) { IO.addZipEntry(zipout, "files/", fle.getJavaFile(), null, null); } } private void zipEntities(String name, Collection<? extends AEntity> entities) throws Exception { for (AEntity entity : entities) { File file = new File(dataDir.getPath() + "/entities/" + name + "/" + entity.getId() + ".xml"); if (!file.exists()) { LOG.warn("File does not exist: " + file.getAbsolutePath()); continue; } String path = "entities/" + name + "/"; IO.addZipEntry(zipout, path, file, null, null); } } }