使用Groovy控制台在AEM中获取标记的引用

问题描述 投票:0回答:2

我正在尝试获取使用某些AEM标记的引用/路径。我试过这个:

import org.apache.sling.api.resource.Resource
import com.day.cq.tagging.Tag
import com.day.cq.tagging.TagManager
import org.apache.sling.api.resource.ResourceResolver
import java.lang.Thread.*;
import javax.jcr.Node;

def tagpath = "/etc/tags";
def delay = 10 ; //in Milliseconds.

def query = getAllTags(tagpath)
def result = query.execute()

def rows = result.rows
def unusedTags = 0

rows.each { row ->
    Resource res = resourceResolver.getResource(row.path)
    if(res!=null){
        Tag tag = res.adaptTo(com.day.cq.tagging.Tag)
        Node tempNode = res.adaptTo(javax.jcr.Node);
        TagManager tm = resourceResolver.adaptTo(com.day.cq.tagging.TagManager);
        FindResults fr = tm.findByTitle(tag.title)
        RangeIterator rangeIterator = fr.resources; -> this throws Cast Exception
        //how to get paths of results (content) from fr to see where is this tag used

        Thread.currentThread().sleep((long)(delay));
    }
}


def getAllTags(tagpath) {
 def queryManager = session.workspace.queryManager
 def statement = "/jcr:root"+tagpath+"//element(*, cq:Tag)"
 def query = queryManager.createQuery(statement, "xpath")
}

现在我对如何从fr变量获得结果感兴趣。我应该以某种方式使它适应Resource类,或者我如何获得返回的资产/页面的路径?

FindResults findByTitle(String) - 搜索使用包含给定标题的标记标记为标记标题的所有内容。

java groovy aem cq5
2个回答
0
投票
import org.apache.sling.api.resource.Resource
import com.day.cq.tagging.Tag
import com.day.cq.tagging.TagManager
import com.day.cq.tagging.TagManager.FindResults
import org.apache.sling.api.resource.ResourceResolver
import java.lang.Thread.*;
import javax.jcr.Node;
import javax.jcr.RangeIterator;


def tagpath = "/etc/tags";

def query = getAllTags(tagpath)
def result = query.execute()

def rows = result.rows
def counter = 1;

def tagTitles = ["tag1", "tag2", "tag3"]

rows.each { row ->
Resource res = resourceResolver.getResource(row.path)
    if(res!=null){
        Tag tag = res.adaptTo(com.day.cq.tagging.Tag)
        Node tempNode = res.adaptTo(javax.jcr.Node);
        TagManager tm = resourceResolver.adaptTo(com.day.cq.tagging.TagManager);

        tagTitles.each { tagTitle ->
            if(tag.title.equalsIgnoreCase(tagTitle)){
                counter++;
                try{
                FindResults fr = tm.findByTitle(tag.title);
                Iterator rangeIterator = fr.resources;

                    if(rangeIterator.size() != 0){
                        println("Tag: " + tagTitle);
                        println("-- References: ");
                        println();

                        fr = tm.findByTitle(tag.title);
                        rangeIterator = fr.resources;
                        rangeIterator.each { resource -> 
                            println(resource.path);
                        }
                    }
                    else{
                    println("REFERENCES NOT FOUND FOR: " + tagTitle);
                    }
                } catch(MissingMethodException ex){
                    println("Title not found in tag list: " + tagTitle);
                    println(ex);
                }
            }
        }
    }
}
println("List lenght: " + tagTitles.size());
println("Number of tags with given title found: " + counter);

def getAllTags(tagpath) {
 def queryManager = session.workspace.queryManager
 def statement = "/jcr:root"+tagpath+"//element(*, cq:Tag)"
 def query = queryManager.createQuery(statement, "xpath")
}

这就是答案。我不知道确切的原因,但Groovy无法识别RangeIterator。在我看到RangeIterator扩展Iterator并以新的方式使用它之后,它开始工作了。

------编辑------

我不认为这是完整的答案,因为我不知道Groovy没有将其识别为RangeIterator的确切原因,所以如果有人能够回答这个问题,请做。

此外,这个fr = tm.findByTitle(tag.title);只获得带有给定标题的标签的引用,还是他的孩子的参考?


-1
投票

由于返回的类不是迭代器,因此存在Cast Exception。这是一个RangeIterator这个类从迭代器扩展并提供了一些有用的额外方法。

如果你使用RangeIterator rangeIterator = fr.resources最好

然后你可以正常继承hasNext next方法

在这种情况下,这是Resource的RangeIterator,因此您可以通过在每个元素上调用getPath方法来获取路径。

© www.soinside.com 2019 - 2024. All rights reserved.