AEM Querybuilder Получение ссылки - PullRequest
0 голосов
/ 11 июля 2019

Я помогаю контролировать (обеспечение качества) веб-сайт в AEM, который имеет около 65 000 страниц, 320 000 ресурсов и около 300 пользователей, которые могут публиковать и вносить изменения.Одна вещь, которая была чрезвычайно полезна, - это сценарий, который для нас написал бывший сотрудник ИТ, который использовал сервлет построения запросов для выполнения запросов и получения полных списков страниц и ресурсов.Я смог взять этот вывод и построить все виды автоматизированных отчетов, используя его.

Одна вещь, которую я не смог выяснить, это как узнать, ссылается ли другой ресурс или страница на другойстр.Главное, что меня волнует, это просто истина / ложь, если на нее ссылаются или нет.В идеале мне бы хотелось, чтобы это было в исходном запросе и не требовалось выполнять запрос для каждого отдельного актива, но если это единственный способ, то я предполагаю, что это теоретически может быть приемлемым.

ПростоПример запроса, который я мог бы запустить в настоящее время, чтобы получить некоторую информацию об активах (я ограничил этот результат 5 примерами):

http://localhost:4502/bin/querybuilder.json?p.hits=selective&p.offset=0&p.limit=5&p.properties=jcr%3acontent%2fmetadata%2fdc%3aformat%20jcr%3acontent%2fmetadata%2fdc%3atitle%20jcr%3apath%20&path=%2fcontent%2fdam&type=dam%3aAsset

Есть ли способ добавить к этому полю, если на него есть ссылка?Или массив всех ссылок на него?

В настоящее время мы работаем с AEM 6.2, но скоро обновимся до 6.4.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Существует сервлет OOTB, который вернет список страниц, которые ссылаются на определенную страницу или актив

Чтобы проверить, есть ли ссылка на страницу или ресурс, используйте

https://localhost:4502/bin/wcm/references?
_charset_=utf-8
&path=<path of the page>
&predicate=wcmcontent
&exact=false

Выводом будет ответ json, содержащий массив ссылок с именем 'pages'. Если на страницу не ссылаются, это будет пустой массив.

Этот сервлет использует ReferenceSearch API, о котором упоминается в другом ответе. Если вам нужно это значение как JSON за пределами AEM, вы можете сразу использовать OOTB без необходимости написания собственного сервлета.

0 голосов
/ 15 июля 2019

По вашему требованию вы можете использовать API AssetReferenceSearch , который может предоставить подробную информацию об активах, используемых на странице (узел типа cq: Page ).

Вы можете использовать следующий код для выполнения вашей задачи -

package org.redquark.aem.assets.core;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.jcr.Node;
import javax.servlet.Servlet;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.dam.api.Asset;
import com.day.cq.dam.commons.util.AssetReferenceSearch;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
 * @author Anirudh Sharma
 *
 */
@Component(
        service = Servlet.class, 
        property = { 
                "sling.servlet.methods=GET", 
                "sling.servlet.resourceTypes=cq/Page",
                "sling.servlet.selectors=assetreferences", 
                "sling.servlet.extensions=json", 
                "service.ranking=1000" 
                }
        )
public class FindReferencedAssetsServlet extends SlingSafeMethodsServlet {

    // Generated serial version UID
    private static final long serialVersionUID = 8446564170082865006L;

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    private static final String DAM_ROOT = "/content/dam";

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {

        response.setContentType("application/json");

        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        try {

            // Get the current node reference from the resource object
            Node currentNode = request.getResource().adaptTo(Node.class);

            if (currentNode == null) {
                // Every adaptTo() can return null, so let's handle the case here
                // However, it is very unlikely
                log.error("Cannot adapt resource {} to a node", request.getResource().getPath());
                response.getOutputStream().print(new Gson().toString());

                return;
            }

            // Using AssetReferenceSearch which will do all the work for us
            AssetReferenceSearch assetReferenceSearch = new AssetReferenceSearch(currentNode, DAM_ROOT,
                    request.getResourceResolver());

            Map<String, Asset> result = assetReferenceSearch.search();

            List<AssetDetails> assetList = new LinkedList<>();

            for (String key : result.keySet()) {

                Asset asset = result.get(key);

                AssetDetails assetDetails = new AssetDetails(asset.getName(), asset.getPath(), asset.getMimeType());

                assetList.add(assetDetails);
            }

            String jsonOutput = gson.toJson(assetList);

            response.getOutputStream().println(jsonOutput);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

    }
}

Соответствующий класс модели AssetDetails выглядит следующим образом -

package org.redquark.aem.assets.core;

/**
 * @author Anirudh Sharma
 */
public class AssetDetails {

    private String name;
    private String path;
    private String mimeType;

    /**
     * @param name
     * @param path
     * @param mimeType
     */
    public AssetDetails(String name, String path, String mimeType) {
        this.name = name;
        this.path = path;
        this.mimeType = mimeType;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the path
     */
    public String getPath() {
        return path;
    }

    /**
     * @param path the path to set
     */
    public void setPath(String path) {
        this.path = path;
    }

    /**
     * @return the mimeType
     */
    public String getMimeType() {
        return mimeType;
    }

    /**
     * @param mimeType the mimeType to set
     */
    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }
}

Теперь вы можете вызвать этот сервлет по следующему запросу -

http://localhost:4502/content/we-retail/language-masters/en/men.assetreferences.json.

Это даст вывод в следующем формате

[
  {
    "name": "running-trail-man.jpg",
    "path": "/content/dam/we-retail/en/activities/running/running-trail-man.jpg",
    "mimeType": "image/jpeg"
  },
  {
    "name": "enduro-trail-jump.jpg",
    "path": "/content/dam/we-retail/en/activities/biking/enduro-trail-jump.jpg",
    "mimeType": "image/jpeg"
  },
  {
    "name": "indoor-practicing.jpg",
    "path": "/content/dam/we-retail/en/activities/climbing/indoor-practicing.jpg",
    "mimeType": "image/jpeg"
  }
]

Вы можете редактировать класс AssetDetails согласно вашему требованию.

Надеюсь, это поможет. Удачного кодирования !!!

...