private Attachment prepareAttachment(
     String fileName, String contentType, User user, byte[] contents, String tags) {
   try {
     Attachment a = new Attachment();
     a.setName(fileName);
     a.setMimeType(contentType);
     File root = new File(DEFAULT_UPLOAD_DIRECTORY, user.getLogin());
     root.mkdirs();
     File tmpFile = File.createTempFile("upload_", ".bin", root);
     FileUtils.writeToFile(tmpFile, contents);
     a.setSize((long) contents.length);
     a.setMD5(FileUtils.getMD5(tmpFile));
     a.setFileName(user.getLogin() + "/" + tmpFile.getName());
     return a;
   } catch (Exception ex) {
     return null;
   }
 }
  @Override
  public Attachment renameAttachment(Long userId, long attachmentId, String name) {
    if (log.isDebugEnabled()) {
      log.debug(">> renameAttachment() : userId =" + userId + ", attachmentId=" + attachmentId);
    }
    if (userId == null) {
      if (log.isTraceEnabled()) {
        log.trace("<< renameAttachment() : null // operation is not permitted");
      }
      return null;
    }

    User u = em.find(User.class, userId);
    if (u == null) {
      if (log.isTraceEnabled()) {
        log.trace("<< renameAttachment() : null // no such user! operation is not permitted");
      }
      return null;
    }
    Attachment att = em.find(Attachment.class, attachmentId);
    if (att == null) {
      if (log.isTraceEnabled()) {
        log.trace("<< renameAttachment() : null // invalid attachmentId=" + attachmentId);
      }
      return null;
    }
    if (!isOwner(u, att) && u.getUserGroup() != User.ADMIN) {
      if (log.isTraceEnabled()) {
        log.trace("<< renameAttachment() : null // operation is not permitted");
      }
      return null;
    }
    att.setName(name);
    if (log.isDebugEnabled()) {
      log.debug(">> renameAttachment() : userId =" + userId + ", attachmentId=" + attachmentId);
    }
    return em.merge(att);
  }
  private Attachment prepareAttachment(User user, List<ReshakaUploadedFile> files, String tags) {
    if (files.isEmpty()) {
      if (log.isDebugEnabled()) {
        log.debug("prepareAttachment() : List of files is empty! Nothing to compress.");
      }
      return null;
    }
    if (files.size() == 1) {
      if (log.isTraceEnabled()) {
        log.trace(
            "prepareAttachment() : Single file is being uploaded. Delegating to uploadFile()");
      }
      try {
        return prepareAttachment(
            files.get(0).getFileName(),
            files.get(0).getContentType(),
            user,
            files.get(0).getContents(),
            tags);
      } catch (IOException ex) {
        if (log.isTraceEnabled()) {
          log.trace("prepareAttachment() : I/O exception" + ex);
        }
        return null;
      }
    }

    try {
      // create zip file
      log.trace("prepareAttachment(): Creating zip-file");

      File root = new File(DEFAULT_UPLOAD_DIRECTORY, user.getLogin());
      root.mkdirs();
      File file = File.createTempFile("upload_", ".zip", root);
      try (ZipOutputStream zos = new ZipOutputStream(file)) {
        zos.setEncoding("utf-8");
        zos.setMethod(ZipOutputStream.DEFLATED);
        zos.setLevel(Deflater.BEST_COMPRESSION);

        for (ReshakaUploadedFile uf : files) {
          addFileToZip(zos, uf, uf.getFileName());
        }
      }

      if (log.isDebugEnabled()) {
        log.debug("prepareAttachment(): Files are saved at " + file);
      }

      if (file.length() > MAX_ZIP_SIZE) {
        file.delete();
        throw new IOException("File too large.");
      }

      // Create attachment
      Attachment att = new Attachment();
      att.setName(file.getName());
      att.setMimeType("application/zip");
      att.setSize(file.length());
      att.setMD5(FileUtils.getMD5(file));
      att.setFileName(user.getLogin() + "/" + file.getName());

      if (log.isTraceEnabled()) {
        log.trace("<< prepareAttachment()");
      }
      return att;
    } catch (IOException ex) {
      log.error("prepareAttachment(): Failed to upload files. ", ex);
      return null;
    }
  }