1

如果内容为空,我想避免激活某些页面。我使用一些 servlet 执行此操作,如下所示:

@SlingServlet(paths = "/bin/servlet", methods = "GET", resourceTypes = "sling/servlet/default")
public class ValidatorServlet extends SlingAllMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
        String page = "pathToPage";
        PageManager pageManager = request.adaptTo(PageManager.class);
        Page currentPage = pageManager.getPage(page);
        boolean result = pageHasContent(currentPage);
    }

现在如何检查,如果currentPage有内容?

4

3 回答 3

2

请注意,以下答案发布于 2013 年,当时 CQ/AEM 与当前版本有很大不同。如果使用,以下内容可能无法始终如一地工作。有关更多信息,请参阅下面的 Tadija Malic 的回答

Page 类的 hasContent() 方法可以用来检查页面是否有内容。如果页面有jcr:content节点,则返回 true,否则返回 false。

boolean result = currentPage != null ? currentPage.hasContent() : false;

如果您想检查尚未创作的页面,一种可能的方法是检查 jcr:content 下是否存在任何其他节点。

Node contentNode = currentPage.getContentResource().adaptTo(Node.class);
boolean result = contentNode.hasNodes();
于 2013-11-11T12:17:08.453 回答
2

我将创建一个 OSGi 服务,它接受一个 Page 并根据您设置的规则遍历其内容树,以确定该页面是否具有有意义的内容。

页面是否具有实际内容是特定于应用程序的,因此创建自己的服务将使您能够完全控制该决定。

于 2013-11-12T09:20:47.513 回答
0

一种方法是使用相同的模板创建一个新页面,然后遍历节点列表并计算组件的哈希值(或它们的内容,具体取决于您想要比较的内容)。获得空页面模板的哈希后,您就可以将任何其他页面哈希与之进行比较。

注意:此解决方案需要适应您自己的用例。也许您只需检查页面上的哪些组件及其顺序就足够了,也许您还想比较它们的配置。

private boolean areHashesEqual(final Resource copiedPageRes, final Resource currentPageRes) {
    final Resource currentRes = currentPageRes.getChild(com.day.cq.commons.jcr.JcrConstants.JCR_CONTENT);
    return currentRes != null && ModelUtils.getPageHash(copiedPageRes).equals(ModelUtils.getPageHash(currentRes));
}

模型用途:

public static String getPageHash(final Resource res) {
    long pageHash = 0;

    final Queue<Resource> components = new ArrayDeque<>();
    components.add(res);

    while (!components.isEmpty()) {
        final Resource currentRes = components.poll();

        final Iterable<Resource> children = currentRes.getChildren();
        for (final Resource child : children) {
            components.add(child);
        }
        pageHash = ModelUtils.getHash(pageHash, currentRes.getResourceType());
    }

    return String.valueOf(pageHash);
}

/**
 * This method returns product of hashes of all parameters
 * @param args
 * @return int hash
 */
public static long getHash(final Object... args) {
    int result = 0;
    for (final Object arg : args) {
        if (arg != null) {
            result += arg.hashCode();
        }
    }
    return result;
}

注意:使用 Queue 也会考虑组件的顺序。

这是我的方法,但我有一个非常具体的用例。通常,您会想考虑是否真的要计算要发布的每个页面上每个组件的哈希值,因为这会减慢发布过程。您还可以在每次迭代中比较哈希并打破第一个差异的计算。

于 2021-02-18T12:31:10.267 回答