@Override
 public boolean hasData() {
   try {
     return !this.docStore.search(DATA_RETRIEVE_QUERY, 1, 0, this.context.get()).isEmpty();
   } catch (XWikiException ex) {
     this.logger.warn(
         "Failed to search for deleted attachments in the database trash: {}", ex.getMessage());
     return false;
   }
 }
 @Override
 public Iterator<EntityReference> listData() {
   try {
     List<Object[]> data = this.docStore.search(DATA_REFERENCE_QUERY, 0, 0, this.context.get());
     return new ReferenceIterator(data);
   } catch (XWikiException ex) {
     this.logger.warn("Failed to list the database deleted attachments: {}", ex.getMessage());
     return Collections.emptyIterator();
   }
 }
 /**
  * Trigger a BaseObject job (execute it now).
  *
  * @param object the BaseObject Job to be triggered
  * @return true on success, false on failure.
  */
 public boolean triggerJob(BaseObject object) {
   try {
     getProtectedPlugin().triggerJob(object, this.context);
     LOGGER.debug("Trigger Job: [{}]", object.getStringValue("jobName"));
     return true;
   } catch (XWikiException e) {
     this.context.put("error", e.getMessage());
     return false;
   }
 }
 public void addWriter(String spaceName, String userName, boolean allowDowngrade) {
   if (hasProgrammingRights()) {
     try {
       getWorkspacesManager().addWriter(spaceName, userName, allowDowngrade, context);
     } catch (XWikiException e) {
       context.put("haserror", "1");
       context.put("lasterror", e.getMessage());
     }
   }
 }
 /** Remove a reader from a workspace, removing him as a member too */
 public void removeReader(String spaceName, String userName) {
   if (hasProgrammingRights()) {
     try {
       getWorkspacesManager().removeReader(spaceName, userName, context);
     } catch (XWikiException e) {
       context.put("haserror", "1");
       context.put("lasterror", e.getMessage());
     }
   }
 }
 @Override
 public Iterator<DeletedAttachment> getData() {
   try {
     List<Long> data = this.docStore.search(DATA_RETRIEVE_QUERY, 0, 0, this.context.get());
     this.logger.debug("Found [{}] deleted attachments in the database trash", data.size());
     return new DeletedAttachmentIterator(data);
   } catch (XWikiException ex) {
     this.logger.warn(
         "Failed to get the list of database deleted attachments: {}", ex.getMessage());
     return Collections.emptyIterator();
   }
 }
 /**
  * Loops over the {@code rightsCombinations} and attaches a new rights object for each combination
  * to the document.
  *
  * @param rightsCombinations the string array containing all the combinations for which there
  *     should be an object created
  * @param rightsObjects the map of existing rights objects
  * @param doc XWikiDocument
  * @param context XWikiContext
  */
 private void createRights(
     List<String> rightsCombinations,
     Map<String, BaseObject> rightsObjects,
     XWikiDocument doc,
     XWikiContext context) {
   for (String rights : rightsCombinations) {
     try {
       BaseObject newRightObject = doc.newXObject(RIGHTS_CLASS, context);
       newRightObject.setStringValue("levels", rights);
       newRightObject.setIntValue("allow", 1);
       rightsObjects.put(rights, newRightObject);
     } catch (XWikiException ex) {
       this.logger.error("Failed to create rights: {}", ex.getMessage(), ex);
     }
   }
 }
 @Override
 public boolean discardAllData() {
   boolean transaction = false;
   try {
     transaction = ((XWikiHibernateBaseStore) this.store).beginTransaction(this.context.get());
     Session session = ((XWikiHibernateBaseStore) this.store).getSession(this.context.get());
     session.createQuery("delete from DeletedAttachment").executeUpdate();
   } catch (XWikiException ex) {
     this.logger.warn(
         "Failed to cleanup all attachments from the database trash: {}", ex.getMessage());
     return false;
   } finally {
     if (transaction) {
       ((XWikiHibernateBaseStore) this.store).endTransaction(this.context.get(), transaction);
     }
   }
   return true;
 }
 @Override
 public boolean discardEntity(DeletedAttachment entity) {
   boolean transaction = false;
   try {
     transaction = ((XWikiHibernateBaseStore) this.store).beginTransaction(this.context.get());
     Session session = ((XWikiHibernateBaseStore) this.store).getSession(this.context.get());
     session.delete(entity);
     this.logger.debug(
         "Deleted deleted attachment [{}@{}#{}] from the database trash",
         entity.getDocName(),
         entity.getFilename(),
         entity.getId());
   } catch (XWikiException ex) {
     this.logger.warn("Failed to cleanup attachment from the database trash: {}", ex.getMessage());
     return false;
   } finally {
     if (transaction) {
       ((XWikiHibernateBaseStore) this.store).endTransaction(this.context.get(), transaction);
     }
   }
   return true;
 }
  @Override
  public Representation represent(Variant variant) throws ResourceException {
    setupXWiki();

    Request request = getRequest();
    String assetName = (String) request.getAttributes().get("assetName");
    String textId = (String) request.getAttributes().get("textId");
    // if (!textId.equals("0")) {
    //    throw error(Status.CLIENT_ERROR_NOT_FOUND, "An asset may only have one viditalk movie");
    // }

    TextAsset asset = null;
    try {
      asset = (TextAsset) plugin.fetchAssetAs(assetName, TextAsset.class);
    } catch (XWikiException e) {
      throw error(Status.CLIENT_ERROR_NOT_FOUND, e.getMessage());
    }
    if (asset == null) {
      throw error(Status.CLIENT_ERROR_NOT_FOUND, "Asset " + assetName + " not found.");
    }

    String content = null;
    String syntax = null;
    try {
      content = asset.getText();
      syntax = asset.getTextSyntax();
    } catch (XWikiException e) {
      throw error(Status.CLIENT_ERROR_NOT_FOUND, "No texts found for " + assetName);
    }

    JSONObject json = new JSONObject();
    json.put("text", content);
    json.put("syntax", syntax);

    return formatJSON(json, variant);
  }