@Override
  public AttachmentDAO getAttachmentInfo(final String id) throws AttachmentMgtException {
    try {
      AttachmentDAO resultantDAO =
          jobExecutor.execTransaction(
              new Callable<AttachmentDAO>() {
                @Override
                public AttachmentDAO call() throws Exception {
                  AttachmentDAO attachmentDAO = null;
                  attachmentDAO = entityManager.find(AttachmentDAOImpl.class, Long.parseLong(id));
                  return attachmentDAO;
                }
              });

      if (resultantDAO != null) {
        return resultantDAO;
      } else {
        throw new AttachmentMgtException("Attachment not found for id : " + id);
      }
    } catch (Exception e) {
      String errorMsg =
          "org.wso2.carbon.attachment.mgt.core.dao.impl.hibernate.AttachmentMgtDAOFactoryImpl.getAttachmentInfo operation failed. "
              + "Reason: "
              + e.getLocalizedMessage();
      log.error(errorMsg, e);
      throw new AttachmentMgtException(errorMsg, e);
    }
  }
  @Override
  public AttachmentDAO addAttachment(final Attachment attachment) throws AttachmentMgtException {
    try {
      AttachmentDAO resultantDAO =
          jobExecutor.execTransaction(
              new Callable<AttachmentDAO>() {
                @Override
                public AttachmentDAO call() throws Exception {
                  AttachmentDAO attachmentDAO = new AttachmentDAOImpl();
                  attachmentDAO.setName(attachment.getName());
                  attachmentDAO.setCreatedBy(attachment.getCreatedBy());
                  attachmentDAO.setContentType(attachment.getContentType());
                  attachmentDAO.setUrl(URLGeneratorUtil.generateURL());
                  attachmentDAO.setContent(attachment.getContent());

                  entityManager.persist(attachmentDAO);
                  if (entityManager.contains(attachmentDAO)) {
                    return attachmentDAO;
                  } else {
                    String errorMsg = "Attachment couldn't persist in the Data Store";
                    throw new AttachmentMgtException(errorMsg);
                  }
                }
              });
      return resultantDAO;
    } catch (Exception e) {
      String errorMsg =
          "org.wso2.carbon.attachment.mgt.core.dao.impl.hibernate.AttachmentMgtDAOFactoryImpl.addAttachment operation failed. "
              + "Reason: "
              + e.getLocalizedMessage();
      log.error(errorMsg, e);
      throw new AttachmentMgtException(errorMsg, e);
    }
  }
 @Override
 public boolean removeAttachment(final String id) throws AttachmentMgtException {
   try {
     boolean isRemoved = false;
     isRemoved =
         jobExecutor.execTransaction(
             new Callable<Boolean>() {
               @Override
               public Boolean call() throws Exception {
                 Query query =
                     entityManager.createQuery(
                         "DELETE FROM org.wso2.carbon.attachment.mgt.core.dao.impl"
                             + ".jpa.openjpa.entity.AttachmentDAOImpl x WHERE x.id = "
                             + ":attachmentID");
                 query.setParameter("attachmentID", Long.parseLong(id));
                 int noOfRowsUpdated = query.executeUpdate();
                 // entityManager.remove(getAttachmentInfo(id));
                 if (noOfRowsUpdated == 1) {
                   return true;
                 } else {
                   return false;
                 }
               }
             });
     return isRemoved;
   } catch (Exception e) {
     String errorMsg =
         "org.wso2.carbon.attachment.mgt.core.dao.impl.hibernate.AttachmentMgtDAOFactoryImpl.removeAttachment operation failed. "
             + "Reason: "
             + e.getLocalizedMessage();
     log.error(errorMsg, e);
     throw new AttachmentMgtException(errorMsg, e);
   }
 }
  @Override
  public AttachmentDAO getAttachmentInfoFromURL(final String attachmentURI)
      throws AttachmentMgtException {
    try {
      AttachmentDAO resultantDAO =
          jobExecutor.execTransaction(
              new Callable<AttachmentDAO>() {
                @Override
                public AttachmentDAO call() throws Exception {
                  Query query =
                      entityManager.createQuery(
                          "SELECT x FROM org.wso2.carbon.attachment.mgt.core.dao.impl.jpa.openjpa.entity.AttachmentDAOImpl AS x WHERE x.url = :attachmentURI");
                  query.setParameter("attachmentURI", attachmentURI);

                  List<AttachmentDAO> daoList = query.getResultList();

                  if (daoList.isEmpty()) {
                    throw new AttachmentMgtException(
                        "Attachment not found for the uri:" + attachmentURI);
                  } else if (daoList.size() != 1) {
                    String errorMsg =
                        "There exist more than one attachment for the attachment URI:"
                            + attachmentURI
                            + ". org"
                            + ".wso2.carbon.attachment.mgt.util.URLGeneratorUtil.generateURL method has generated "
                            + "similar uris for different attachments. This has caused a major inconsistency for "
                            + "attachment management.";
                    log.fatal(errorMsg);
                    throw new AttachmentMgtException(errorMsg);
                  } else {
                    return daoList.get(0);
                  }
                }
              });
      return resultantDAO;
    } catch (Exception e) {
      String errorMsg =
          "org.wso2.carbon.attachment.mgt.core.dao.impl.hibernate.AttachmentMgtDAOFactoryImpl.getAttachmentInfoFromURL operation failed. "
              + "Reason: "
              + e.getLocalizedMessage();
      log.error(errorMsg, e);
      throw new AttachmentMgtException(errorMsg, e);
    }
  }